在矩形矩阵r中进行方块的转置

时间:2016-05-30 20:11:09

标签: r matrix dataframe

假设我有两个绑定在一起的方形矩阵(实际上更多):

mat = matrix(1:18,nrow=3,ncol=6)

mat
     [,1] [,2] [,3] [,4] [,5] [,6]
[1,]    1    4    7   10   13   16
[2,]    2    5    8   11   14   17
[3,]    3    6    9   12   15   18

我想对每个(3x3)矩阵进行转置,并将它们并排粘在一起,结果是:

mat2
     [,1] [,2] [,3] [,4] [,5] [,6]
[1,]    1    2    3   10   11   12
[2,]    4    5    6   13   14   15
[3,]    7    8    9   16   17   18

我不想手动执行此操作,因为它是多个矩阵cbound在一起,而不仅仅是2。

我想要一个避免循环或应用的解决方案(这只是一个循环的包装器)。我需要有效的解决方案,因为这将需要运行数万次。

2 个答案:

答案 0 :(得分:5)

一种方法是使用矩阵索引

END

这将采用转置矩阵并按所需顺序重新排列列。

matrix(t(m), nrow=nrow(m))[, c(matrix(1:ncol(m), nrow(m), byrow=T)) ]

所以我们想要第1列,第3列和第5列,以及第2列,第4列和第6列。 一种方法是使用

对这些进行索引
m <- matrix(1:18,nrow=3,ncol=6)
matrix(t(m), nrow=nrow(m))
#      [,1] [,2] [,3] [,4] [,5] [,6]
# [1,]    1   10    2   11    3   12
# [2,]    4   13    5   14    6   15
# [3,]    7   16    8   17    9   18

作为替代方案,您可以使用

c(matrix(1:ncol(m), nrow(m), byrow=T))
#[1] 1 3 5 2 4 6

尝试新矩阵

idx <- rep(1:ncol(m), each=nrow(m), length=ncol(m)) ;
do.call(cbind, split.data.frame(t(m), idx))

答案 1 :(得分:3)

这可能会这样做:

ViewHolder

对两种方法感到好奇和时间安排。 user20650使用的mat = matrix(1:18,nrow=3,ncol=6) mat output <- lapply(seq(3, ncol(mat), 3), function(i) { t(mat[, c((i - 2):i)]) } ) output do.call(cbind, output) # [,1] [,2] [,3] [,4] [,5] [,6] #[1,] 1 2 3 10 11 12 #[2,] 4 5 6 13 14 15 #[3,] 7 8 9 16 17 18 方法比我使用的matrix方法快得多:

lapply