微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

向R中的矩阵添加可调整的随机噪声

如何解决向R中的矩阵添加可调整的随机噪声

我有一个矩阵生成函数,可以生成1 s的下三角和0s的上三角。

我想知道是否有可能向输出矩阵添加一些可调的随机噪声(来自给随机01的某种分布),从而使随机0 s随机替换一些底部1,而随机1随机替换一些顶部的0

lower_mat <- function(r,c) {
  m <- matrix(0,nrow=r,ncol=c)
  m[lower.tri(m)] <- 1
  m
}


lower_mat(5,4)
#      [,1] [,2] [,3] [,4]
# [1,]    0    0    0    0
# [2,]    1    0    0    0
# [3,]    1    1    0    0
# [4,]    1    1    1    0
# [5,]    1    1    1    1

解决方法

如果您想假设要从较低到较高的位置交换一定数量的头寸,可以这样做

swap_upper_lower <- function(m,n) {
  tops <- which(upper.tri(m))
  bots <- which(lower.tri(m))
  stopifnot(length(bots)>=n && length(tops)>=n)
  tops <- sample(tops,n)
  bots <- sample(tops,n)
  vals <- m[tops]
  m[tops] <- m[bots]
  m[bots] <- vals
  m
}

mm <- lower_mat(5,4)
swap_upper_lower(mm,3)

这将从下三角到上三角交换3个值

如果您希望将其视为交换0和1的位置,则可以代替

swap_0_1 <- function(m,n) {
  ones <- which(m==1)
  zers <- which(m==0)
  stopifnot(length(ones)>=n && length(zers)>=n)
  ones <- sample(ones,n)
  zers <- sample(zers,n)
  vals <- m[ones]
  m[ones] <- m[zers]
  m[zers] <- vals
  m
}

请注意,这将对角线上的值与其他函数不同。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。