2010-10-16 15 views
3

J'ai une matrice A qui est:Créer une plus grande matrice de plus petite

A <- matrix(c(1:15), byrow=T, nrow=5) 
A 
    [,1] [,2] [,3] 
[1,] 1 2 3 
[2,] 4 5 6 
[3,] 7 8 9 
[4,] 10 11 12 
[5,] 13 14 15 

Maintenant, je veux créer une matrice B, ce qui est des dimensions de 8x8 (ou 10x10 ou 15x15, etc.), ce qui serait ressembler à ceci:

 [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] 
[1,] 1 2 3 0 0 0 0 0 
[2,] 4 5 6 0 0 0 0 0 
[3,] 7 8 9 0 0 0 0 0 
[4,] 10 11 12 0 0 0 0 0 
[5,] 13 14 15 0 0 0 0 0 
[6,] 0 0 0 0 0 0 0 0 
[7,] 0 0 0 0 0 0 0 0 
[8,] 0 0 0 0 0 0 0 0 

Ainsi, à partir de A, je veux ajouter des colonnes et des lignes, à une dimension de 8x8, toutes remplacées par des valeurs nulles ... une idée? Merci d'avance !!

Répondre

3

Essayez cette hypothèse A a au moins une ligne et une colonne:

B <- matrix(0, 8, 8) 
B[1:nrow(A), 1:ncol(A)] <- A 

ou comme une seule déclaration:

B <- "[<-"(matrix(0, 8, 8), 1:nrow(A), 1:ncol(A), value = A) 

Si A peut avoir zéro lignes ou zéro colonnes puis utilisez seq_len(nrow(A)) et seq_len(ncol(A)) à la place de 1:nrow(A) et 1:ncol(A).

Sinon, cela fonctionne même dans le cas où A a zéro des lignes ou des colonnes:

B <- matrix(0, 8, 8) 
B[cbind(c(row(A)), c(col(A)))] <- A 

ou

B <- "[<-"(matrix(0, 8, 8), cbind(c(row(A)), c(col(A))), value = A) 

ou

B <- replace(matrix(0, 8, 8), cbind(c(row(A)), c(col(A))), A) 
+0

Je pense que c'est la meilleure façon d'effectuer ce que je voulais. J'ai utilisé votre suggestion, dans ma fonction. Donc je vous ai cité dans mon nouveau post: http://statistic-on-air.blogspot.com/2010/10/fast-matrix-multiplication-in-r.html Merci beaucoup! – Tommaso

1

Que diriez-vous:

A <- matrix(c(1:15), byrow=T, nrow=5) 

expandMatrix <- function(X, nrow, ncol) { 
    X <- cbind(X, matrix(0, nrow = nrow(X), ncol = ncol - ncol(X))) 
    X <- rbind(X, matrix(0, nrow = nrow - nrow(X), ncol = ncol(X))) 
    X 
} 

Puis

> expandMatrix(A, 8, 8) 
    [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] 
[1,] 1 2 3 0 0 0 0 0 
[2,] 4 5 6 0 0 0 0 0 
[3,] 7 8 9 0 0 0 0 0 
[4,] 10 11 12 0 0 0 0 0 
[5,] 13 14 15 0 0 0 0 0 
[6,] 0 0 0 0 0 0 0 0 
[7,] 0 0 0 0 0 0 0 0 
[8,] 0 0 0 0 0 0 0 0 

ou

> expandMatrix(A, 10, 10) 
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] 
[1,] 1 2 3 0 0 0 0 0 0  0 
[2,] 4 5 6 0 0 0 0 0 0  0 
[3,] 7 8 9 0 0 0 0 0 0  0 
[4,] 10 11 12 0 0 0 0 0 0  0 
[5,] 13 14 15 0 0 0 0 0 0  0 
[6,] 0 0 0 0 0 0 0 0 0  0 
[7,] 0 0 0 0 0 0 0 0 0  0 
[8,] 0 0 0 0 0 0 0 0 0  0 
[9,] 0 0 0 0 0 0 0 0 0  0 
[10,] 0 0 0 0 0 0 0 0 0  0 

pourrait aussi donner une valeur par défaut si vous voulez la plupart du temps matrice carrée comme sorties:

expandMatrix <- function(X, nrow, ncol = nrow) { 
    X <- cbind(X, matrix(0, nrow = nrow(X), ncol = ncol - ncol(X))) 
    X <- rbind(X, matrix(0, nrow = nrow - nrow(X), ncol = ncol(X))) 
    X 
} 

Alors expandMatrix(A, 8) suffirait.

+0

C'est exactement ce que je cherchais! ! Merci beaucoup pour la réponse rapide! – Tommaso

6

Une autre façon est d'abord créer la matrice plus grande, puis fente le petit dans, comme dans cette fonction:

expandR = function(m,nrows,ncols,with=0){ 
     p=matrix(with,nrows,ncols) 
     p[1:nrow(m),1:ncol(m)]=m 
     p 
    } 

Je ne sais pas ce qui est mieux (plus rapide, plus propre, etc.). Mine les erreurs si vous essayez et développez à une taille qui est plus petite que l'original.

+3

Oui, vous êtes plus rapide. Par exemple, à partir d'une matrice B, qui est 5x9, le temps de calcul pour une matrice 4096x4096 avec des zéros est de 0,11 pour votre fonction, et de 0,53 pour la première fonction. Alors merci! – Tommaso

Questions connexes