Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 将矩阵并排放置以创建另一个矩阵_Arrays_R_Matrix - Fatal编程技术网

Arrays 将矩阵并排放置以创建另一个矩阵

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

我有一个由以下代码给出的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
}
让他们被命名为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:谢谢您的编辑,使代码更具可读性。