如何创建这种矩阵?

时间:2015-04-13 02:09:33

标签: r matrix

给定从1到12的数字,是否有任何现有的函数可以创建以下矩阵,并在此处指定类似size的选项?我只能想到使用by.column创建每个矩阵并使用rbind将它们绑定在一起。这有什么更清洁的选择吗?

m <- matrix(1:12, ncol=3, byrow=TRUE)

     [,1] [,2] [,3]
[1,]    1    2    3
[2,]    4    5    6
[3,]    7    8    9
[4,]   10   11   12

期望的输出:

     [,1] [,2] [,3]
[1,]    1    3    5
[2,]    2    4    6
[3,]    7    9   11
[4,]    8   10   12

enter image description here

2 个答案:

答案 0 :(得分:2)

也许这更干净(假设矩阵不是矢量,因为你没有指定列数):

m <- matrix(1:12, ncol=3, byrow=TRUE)

size <- 2
cols <- ncol(m)
m2 <- c(apply(m, 1, c))

do.call(rbind, lapply(split(m2, rep(seq_len(length(m2) /(size*cols)), each = size*cols)), matrix, nrow = size))

##      [,1] [,2] [,3]
## [1,]    1    3    5
## [2,]    2    4    6
## [3,]    7    9   11
## [4,]    8   10   12

答案 1 :(得分:0)

我认为aperm()在这里很有用

mymat<-function(size, ncol=3, start=1, end=12) {
    v <- start:end
    stopifnot(length(v)%%ncol==0, length(v)%%size==0)

    a <- array(v, dim=c(length(v)/ncol/size, ncol, size))
    matrix(aperm(a, c(1,3,2)), ncol=ncol)
}

mymat(2)
#      [,1] [,2] [,3]
# [1,]    1    3    5
# [2,]    2    4    6
# [3,]    7    9   11
# [4,]    8   10   12