问题描述
我有一个矩阵生成函数,可以生成1
s的下三角和0s
的上三角。
我想知道是否有可能向输出矩阵添加一些可调的随机噪声(来自给随机0
和1
的某种分布),从而使随机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
}
请注意,这将对角线上的值与其他函数不同。