Arrays 将矩阵并排放置以创建另一个矩阵
我有一个由以下代码给出的12个矩阵组成的数组:Arrays 将矩阵并排放置以创建另一个矩阵,arrays,r,matrix,Arrays,R,Matrix,我有一个由以下代码给出的12个矩阵组成的数组: ma = array(sample(0:127,3*4*6,replace=TRUE), c(3,4,12)) rbind(cbind(m[,,1],m[,,2],m[,,3]), cbind(m[,,4],m[,,5],m[,,6]), cbind(m[,,7],m[,,8],m[,,9]), cbind(m[,,10],m[,,11],m[,,12])) matbinder2 = function(sub
ma = array(sample(0:127,3*4*6,replace=TRUE), c(3,4,12))
rbind(cbind(m[,,1],m[,,2],m[,,3]),
cbind(m[,,4],m[,,5],m[,,6]),
cbind(m[,,7],m[,,8],m[,,9]),
cbind(m[,,10],m[,,11],m[,,12]))
matbinder2 = function(submat, mats_per_row){
submat_dims = dim(submat)
submatr = submat_dims[1]
submatc = submat_dims[2]
submatn = submat_dims[3]
matc = submatc*mats_per_row
matr = submatr* ceiling(submatn/mats_per_row)
mat = array(NA, c(matr,matc))
for(m in 1:submatn){
r = 1+(floor(submatc*(m-1)/matc))*submatr
c = 1+((submatc*(m-1))%%matc)
i=1;j=1;k=0;l=0;
while(TRUE){
mat[r+l,c+k] = submat[i,j,m]
j=j+1; k=k+1;
if(j>submatc){j=1;k=0; i=i+1;l=l+1;if(i>submatr){break;}}
}
}
mat
}
让他们被命名为A,B,C…L
我想创建一个矩阵,上面的矩阵以4行*3列的模式排列:
ABC
DEF
GHI
JKL
所以最终的矩阵将有12行12列
我可以通过以下代码执行此操作:
ma = array(sample(0:127,3*4*6,replace=TRUE), c(3,4,12))
rbind(cbind(m[,,1],m[,,2],m[,,3]),
cbind(m[,,4],m[,,5],m[,,6]),
cbind(m[,,7],m[,,8],m[,,9]),
cbind(m[,,10],m[,,11],m[,,12]))
matbinder2 = function(submat, mats_per_row){
submat_dims = dim(submat)
submatr = submat_dims[1]
submatc = submat_dims[2]
submatn = submat_dims[3]
matc = submatc*mats_per_row
matr = submatr* ceiling(submatn/mats_per_row)
mat = array(NA, c(matr,matc))
for(m in 1:submatn){
r = 1+(floor(submatc*(m-1)/matc))*submatr
c = 1+((submatc*(m-1))%%matc)
i=1;j=1;k=0;l=0;
while(TRUE){
mat[r+l,c+k] = submat[i,j,m]
j=j+1; k=k+1;
if(j>submatc){j=1;k=0; i=i+1;l=l+1;if(i>submatr){break;}}
}
}
mat
}
但我无法为此编写通用函数:
matbinder(ma,n)
其中,
ma
是输入矩阵数组,n
是要放在一行中的初始矩阵数(在这种情况下为3)。我将使用它作为示例矩阵,因为它将按照您喜欢的顺序排列所有字母
ma = array(as.vector(t(outer(letters[1:12],1:12, FUN=paste0))), c(3,4,12))
然后你可以像这样做转换
a<-ma
dim(a) <- c(3,12,4)
apply(a,2,c)
这是因为通过翻转维度,我们基本上构建了一个由3*12个矩阵组成的4元素数组,这些矩阵对应于我们想要的行。然后我们使用apply跨额外维度进行折叠
一般的matbinder(ma,n)
函数如下
matbinder <- function(ma,n) {
d<-dim(ma)
r<-ceiling(d[3]/n)
a<-c(ma, rep(NA, (n*r-d[3]) * prod(d[1:2])))
dim(a)<-c(d[1], n*d[2],r)
apply(a,2,c)
}
matbinder利用我有限的知识,我管理了以下代码:
ma = array(sample(0:127,3*4*6,replace=TRUE), c(3,4,12))
rbind(cbind(m[,,1],m[,,2],m[,,3]),
cbind(m[,,4],m[,,5],m[,,6]),
cbind(m[,,7],m[,,8],m[,,9]),
cbind(m[,,10],m[,,11],m[,,12]))
matbinder2 = function(submat, mats_per_row){
submat_dims = dim(submat)
submatr = submat_dims[1]
submatc = submat_dims[2]
submatn = submat_dims[3]
matc = submatc*mats_per_row
matr = submatr* ceiling(submatn/mats_per_row)
mat = array(NA, c(matr,matc))
for(m in 1:submatn){
r = 1+(floor(submatc*(m-1)/matc))*submatr
c = 1+((submatc*(m-1))%%matc)
i=1;j=1;k=0;l=0;
while(TRUE){
mat[r+l,c+k] = submat[i,j,m]
j=j+1; k=k+1;
if(j>submatc){j=1;k=0; i=i+1;l=l+1;if(i>submatr){break;}}
}
}
mat
}
伟大的这正是我想要的。谢谢是否可以对其进行修改,以便在ma中只有11个矩阵时,最终矩阵中的剩余位置用“NA”填充。类似地,该函数可能适用于命令matbinder(ma,5),因为当前它会产生一个错误:dims[product 120]与对象[144]的长度不匹配。谢谢。这真是令人印象深刻。@Jilber:谢谢您的编辑,使代码更具可读性。