我有一个包含二进制向量行的矩阵:
library(gtools)
mat<-permutations(2,6,v=c(0,1),repeats.allowed=TRUE)
Run Code Online (Sandbox Code Playgroud)
我想对矩阵的行进行排序,以使每行与其直接邻居(上方和下方)仅相差1位.
这可能吗?
有趣的问题!我想要实现这一目标的方法是从具有较少位数的那些矩阵中递归地构建这样的矩阵.假设我们有一个n位矩阵(包含所有2 ^ n个唯一的n位序列),其中每个邻居最多相差一个.如果我们rbind这个矩阵的反转(按行),则结果的每一行最多相差1,中间的两行相同.我们可以在前半部分前面添加0,在后半部分前面添加1.结果包含所有2 ^(N + 1)唯一的(N + 1)位的序列,和所有邻居具有彼此距离至多为1.
对于基本情况,我们可以使用(0 1)表示1位矩阵.
get.mat <- function(size) {
if (size == 1) {
return(matrix(c(0, 1), ncol=1))
} else {
smaller <- get.mat(size-1)
return(rbind(cbind(0, smaller), cbind(1, smaller[nrow(smaller):1,])))
}
}
get.mat(4)
# [1,] 0 0 0 0
# [2,] 0 0 0 1
# [3,] 0 0 1 1
# [4,] 0 0 1 0
# [5,] 0 1 1 0
# [6,] 0 1 1 1
# [7,] 0 1 0 1
# [8,] 0 1 0 0
# [9,] 1 1 0 0
# [10,] 1 1 0 1
# [11,] 1 1 1 1
# [12,] 1 1 1 0
# [13,] 1 0 1 0
# [14,] 1 0 1 1
# [15,] 1 0 0 1
# [16,] 1 0 0 0
Run Code Online (Sandbox Code Playgroud)
构建这些矩阵的方法的一个有趣的副作用是第一行和最后一行也将具有彼此的距离1.