R 矩阵上的下标数不正确?
我有一个用5x5矩阵填充的列表,我正在尝试使用for循环将列表中的每个矩阵转换为向量,如下所示R 矩阵上的下标数不正确?,r,matrix,R,Matrix,我有一个用5x5矩阵填充的列表,我正在尝试使用for循环将列表中的每个矩阵转换为向量,如下所示 listT<-list() number <- 0 for(a in 0:3){ for(i in 1:(5-a)){ for(j in 1:(5-a)){ A<-matrix(0,nrow=5,ncol=5) A[c(i:(i+a)),c(j:(j+a))]<-1 number<-number+1 listT
listT<-list()
number <- 0
for(a in 0:3){
for(i in 1:(5-a)){
for(j in 1:(5-a)){
A<-matrix(0,nrow=5,ncol=5)
A[c(i:(i+a)),c(j:(j+a))]<-1
number<-number+1
listT[[number]]<-A
}
}
}
vectors<-matrix(0,25,54)
for (number in 1:54){
vectors[,number] <- t(as.vector(listT[[number]]))
}
listT我确实在代码中添加了一行,并且没有错误。见代码:
listT <- list()
number = 0 . # --------------------------- I added this line.
for(a in 0:3){
for(i in 1:(5-a)){
for(j in 1:(5-a)){
A<-matrix(0,nrow=5,ncol=5)
A[c(i:(i+a)),c(j:(j+a))] <- 1
number <- number+1
listT[[number]]<-A
}
}
}
vectors<-matrix(0,25,54)
for (number in 1:54){
vectors[,number] <- t(as.vector(listT[[number]]))
}
在列表的每个元素中循环,而不是在最后循环,sapply()
对列表应用一个函数:
sapply(listT, as.vector)
下面是我将如何重构完整代码:
n_by_n <- 3
A <- matrix(0, nrow = n_by_n, ncol = n_by_n)
lst <- unlist(
lapply(seq_len(n_by_n -1) -1,
function(a) {
all_combos <- expand.grid(1:(n_by_n-a), 1:(n_by_n-a))
lapply(as.data.frame(t(all_combos)),
function(x) {
A[seq(x[1], x[1] + a), seq(x[2], x[2] + a)] <- 1
return(A)
}
)
}),
use.names = F,
recursive = F)
sapply(lst, as.vector)
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13]
[1,] 1 0 0 0 0 0 0 0 0 1 0 0 0
[2,] 0 1 0 0 0 0 0 0 0 1 1 0 0
[3,] 0 0 1 0 0 0 0 0 0 0 1 0 0
[4,] 0 0 0 1 0 0 0 0 0 1 0 1 0
[5,] 0 0 0 0 1 0 0 0 0 1 1 1 1
[6,] 0 0 0 0 0 1 0 0 0 0 1 0 1
[7,] 0 0 0 0 0 0 1 0 0 0 0 1 0
[8,] 0 0 0 0 0 0 0 1 0 0 0 1 1
[9,] 0 0 0 0 0 0 0 0 1 0 0 0 1
菲比,你能提供你的列表吗?嗨,欢迎来到stackoverflow。请提供一个完整的工作示例。在你的例子中,这也将包括listT
。我编辑了原始文章以包含我的代码来创建listTlappy(listT,as.vector)
?最好有一个最小的示例,以便更好地显示预期的输出。无法重现错误,一切都按预期进行。哦,从最后一个循环中删除转置函数t()
,它根本不需要。
n_by_n <- 3
A <- matrix(0, nrow = n_by_n, ncol = n_by_n)
lst <- unlist(
lapply(seq_len(n_by_n -1) -1,
function(a) {
all_combos <- expand.grid(1:(n_by_n-a), 1:(n_by_n-a))
lapply(as.data.frame(t(all_combos)),
function(x) {
A[seq(x[1], x[1] + a), seq(x[2], x[2] + a)] <- 1
return(A)
}
)
}),
use.names = F,
recursive = F)
sapply(lst, as.vector)
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13]
[1,] 1 0 0 0 0 0 0 0 0 1 0 0 0
[2,] 0 1 0 0 0 0 0 0 0 1 1 0 0
[3,] 0 0 1 0 0 0 0 0 0 0 1 0 0
[4,] 0 0 0 1 0 0 0 0 0 1 0 1 0
[5,] 0 0 0 0 1 0 0 0 0 1 1 1 1
[6,] 0 0 0 0 0 1 0 0 0 0 1 0 1
[7,] 0 0 0 0 0 0 1 0 0 0 0 1 0
[8,] 0 0 0 0 0 0 0 1 0 0 0 1 1
[9,] 0 0 0 0 0 0 0 0 1 0 0 0 1