【问题标题】:How to concatenate two matrix column by column?如何逐列连接两个矩阵?
【发布时间】:2020-10-14 18:51:57
【问题描述】:

假设我有两个具有相同维度的矩阵 A 和 B,如下所示:

A = matrix(1:30, nrow=3, ncol=10)
B = matrix(30:1, nrow=3, ncol=10)
#dim(A) = dim(B)
#[1]  3 10
A
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,]    1    4    7   10   13   16   19   22   25    28
[2,]    2    5    8   11   14   17   20   23   26    29
[3,]    3    6    9   12   15   18   21   24   27    30
B
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,]   30   27   24   21   18   15   12    9    6     3
[2,]   29   26   23   20   17   14   11    8    5     2
[3,]   28   25   22   19   16   13   10    7    4     1

是否有一个 R 函数可以将这两个矩阵逐列连接以获得单个矩阵,如下所示?

     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14] [,15] [,16] [,17] [,18] [,19] [,20]
[1,]    1   30    4   27    7   24   10   21   13    18    16    15    19    12    22     9    25     6    28     3
[2,]    2   29    5   26    8   23   11   20   14    17    17    14    20    11    23     8    26     5    29     2
[3,]    3   28    6   25    9   22   12   19   15    16    18    13    21    10    24     7    27     4    30     1

这是我的代码,有什么方法可以优化吗?

C = matrix(NA, nrow=3, ncol=20)
j=1
for(i in 1:10){
  C[,j] = A[,i]
  C[,j+1] = B[,i]
  j=j+2
}

谢谢

【问题讨论】:

  • matrix(rbind(A,B), nrow=3)

标签: r matrix concatenation cbind


【解决方案1】:

您可以cbind这两个矩阵,然后从组合矩阵的前半部分和后半部分中选择交替列:

mat <- cbind(A, B)
inds <- (ncol(mat)/2)
mat[, c(rbind(1:inds, (inds + 1):ncol(mat)))]


#     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11]
#[1,]    1   30    4   27    7   24   10   21   13    18    16
#[2,]    2   29    5   26    8   23   11   20   14    17    17
#[3,]    3   28    6   25    9   22   12   19   15    16    18

#     [,12] [,13] [,14] [,15] [,16] [,17] [,18] [,19] [,20]
#[1,]    15    19    12    22     9    25     6    28     3
#[2,]    14    20    11    23     8    26     5    29     2
#[3,]    13    21    10    24     7    27     4    30     1

【讨论】:

    【解决方案2】:

    你可以这样做:

    matrix(rbind(A,B), nrow=3, ncol=20)
    

    【讨论】:

      【解决方案3】:

      我们可以使用asplit将矩阵拆分为list,然后使用Map,我们可以rbind

      t(do.call(rbind, Map(rbind, asplit(A, 2), asplit(B, 2))))
      #.    [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14] [,15] [,16] [,17] [,18] [,19] [,20]
      #[1,]    1   30    4   27    7   24   10   21   13    18    16    15    19    12    22     9    25     6    28     3
      #[2,]    2   29    5   26    8   23   11   20   14    17    17    14    20    11    23     8    26     5    29     2
      #[3,]    3   28    6   25    9   22   12   19   15    16    18    13    21    10    24     7    27     4    30     1
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-04-28
        • 1970-01-01
        • 2018-04-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多