1
votes

Comment concaténer deux matrices colonne par colonne?

Disons que j'ai deux matrices A et B avec les mêmes dimensions comme suit:

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
}

Existe-t-il une fonction R pour concaténer ces deux matrices colonne par colonne pour obtenir une seule matrice comme suit ?

     [,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

voici mon code, y a-t-il un moyen de l'optimiser?

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

Merci


1 commentaires

matrice (rbind (A, B), nrow = 3)


3 Réponses :


1
votes

Vous pouvez cbind les deux matrices puis sélectionner des colonnes alternées de la première moitié et de la seconde moitié de la matrice combinée:

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


0 commentaires

1
votes

Vous pouvez faire:

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


0 commentaires

1
votes

Nous pouvons utiliser asplit pour diviser les matrices en une liste puis avec Map , nous pouvons 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


0 commentaires