R 通过切换1和0局部搜索获得矩阵
让我们从下面的矩阵开始R 通过切换1和0局部搜索获得矩阵,r,R,让我们从下面的矩阵开始 M <- matrix(c(0,0,0,1,0,0,1,1, 0,0,1,0,0,1,1,0, 0,0,0,0,0,1,1,1, 0,0,0,1,1,0,1,0, 0,0,0,1,1,1,0,0, 0,0,1,0,1,0,0,1),nrow = 8,ncol = 6) [,1] [,2] [,3] [,4] [,5] [,6] [1,] 0
M <- matrix(c(0,0,0,1,0,0,1,1,
0,0,1,0,0,1,1,0,
0,0,0,0,0,1,1,1,
0,0,0,1,1,0,1,0,
0,0,0,1,1,1,0,0,
0,0,1,0,1,0,0,1),nrow = 8,ncol = 6)
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] 0 0 0 0 0 0
[2,] 0 0 0 0 0 0
[3,] 0 1 0 0 0 1
[4,] 1 0 0 1 1 0
[5,] 0 0 0 1 1 1
[6,] 0 1 1 0 1 0
[7,] 1 1 1 1 0 0
[8,] 1 0 1 0 0 1
M这里有一个解决方案。你可以把整个事情包装成一个函数。它生成一个矩阵列表,results
,其中results[[i]]
是一个矩阵列表,其第i
列已切换
column_switcher = function(x) {
ones = which(x == 1)
zeros = which(x == 0)
results = matrix(rep(x, length(ones) * length(zeros)), nrow = length(x))
counter = 1
for (one in ones) {
for (zero in zeros) {
results[one, counter] = 0
results[zero, counter] = 1
counter = counter + 1
}
}
return(results)
}
switched = lapply(1:ncol(M), function(col) column_switcher(M[, col]))
results = lapply(seq_along(switched), function(m_col) {
lapply(1:ncol(switched[[m_col]]), function(i) {
M[, m_col] = switched[[m_col]][, i]
return(M)
})
})
results[[1]]
# [[1]]
# [,1] [,2] [,3] [,4] [,5] [,6]
# [1,] 1 0 0 0 0 0
# [2,] 0 0 0 0 0 0
# [3,] 0 1 0 0 0 1
# [4,] 0 0 0 1 1 0
# [5,] 0 0 0 1 1 1
# [6,] 0 1 1 0 1 0
# [7,] 1 1 1 1 0 0
# [8,] 1 0 1 0 0 1
#
# [[2]]
# [,1] [,2] [,3] [,4] [,5] [,6]
# [1,] 0 0 0 0 0 0
# [2,] 1 0 0 0 0 0
# [3,] 0 1 0 0 0 1
# [4,] 0 0 0 1 1 0
# [5,] 0 0 0 1 1 1
# [6,] 0 1 1 0 1 0
# [7,] 1 1 1 1 0 0
# [8,] 1 0 1 0 0 1
#
# ...
检查列表的长度和子列表的长度,它们都在那里
length(results)
# [1] 6
lengths(results)
# [1] 15 15 15 15 15 15
仔细检查,是否要交换第1列(第1-6行)中的1和0,然后将同一列交换给后面的行,然后分别交换给每一列?看起来您的最终目标是同时交换所有1和0。同时交换所有1和0的一种快速方法是:M@MatthewBorg,我想对单个列执行。我只需为
循环编写一个(嵌套的)。。。逻辑似乎很简单for(其中一个(x==1)){for(其中零个(x==0)){…}
。把它放在一个对单个列进行操作的函数中,然后你可以将该函数应用到每一列。@Gregor我不知道该怎么做。