代码之家  ›  专栏  ›  技术社区  ›  rnorouzian

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

  •  2
  • rnorouzian  · 技术社区  · 4 年前

    1 s和上三角 0s

    我想知道是否可以添加一些可调的随机噪声(从一些随机分布中) 0 )对输出矩阵的随机性 0 随机更换一些底部 s、 随机的 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
    
    1 回复  |  直到 4 年前
        1
  •  1
  •   MrFlick    4 年前

    如果你想假设你是从低到高交换一定数量的位置,你可以这样做

    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
    }
    

    注意,这将不同于其他函数处理对角线上的值。