如果你想假设你是从低到高交换一定数量的位置,你可以这样做
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
}
注意,这将不同于其他函数处理对角线上的值。