我有一个包含二进制向量行的矩阵:
library(gtools)
mat<-permutations(2,6,v=c(0,1),repeats.allowed=TRUE)
我想对矩阵的行进行排序,以使每一行与其直接邻居(上下)仅相差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
构建这些矩阵的方法的一个有趣的副作用是,第一行和最后一行之间的距离也为1。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句