2012-03-15 6 views
4

J'essaie de multiplier chaque ligne d'une matrice par la colonne d'une autre matrice. Par exemple:Multiplication matricielle dans r

mat1 <- matrix(rnorm(10), nrow=5, ncol=2) 
mat2 <- matrix(rnorm(5), nrow=5) 

Je souhaite multiplier chaque ligne de mat1 par mat2. La forme désirée de la sortie est 5 * 2.

+3

Si vous voulez [multiplication matricielle] (http://en.wikipedia.org/wiki/Matrix_multiplication), comme e Le titre suggère, par exemple, vouloir multiplier les lignes de la première matrice par des colonnes de la seconde, c'est 'mat1% *% mat2'. Mais cela nécessite que la première matrice ait autant de colonnes que la seconde a des lignes - ce n'est pas le cas dans votre exemple. –

Répondre

5

Vous pouvez simplement utiliser apply() pour multiplier chaque colonne de mat1 par mat2. (Le "*" effectuera la multiplication par éléments typiquement vectorisée de R des deux vecteurs de longueur égale).

apply(mat1, 2, "*", mat2) 
      [,1]  [,2] 
[1,] 0.1785476 0.4175557 
[2,] 0.2644247 -0.3745997 
[3,] -0.5328542 0.8945527 
[4,] -2.7351502 -0.7715341 
[5,] -0.9719129 -0.1346929 

Ou mieux encore, convertir mat1 un vecteur pour tirer profit des règles de recyclage R:

mat2 <- matrix(1:10, ncol=2) 
mat1 <- matrix(1:5, ncol=1) 

as.vector(mat1)*mat2 
    [,1] [,2] 
[1,] 1 6 
[2,] 4 14 
[3,] 9 24 
[4,] 16 36 
[5,] 25 50 
1

Votre première matrice a cinq lignes et deux colonnes; votre deuxième matrice a cinq rangées et une colonne. S'ils ont le même nombre de lignes et le second a toujours une colonne que vous pouvez faire

mat1 * rep(mat2,ncol(mat1)) 
      [,1]  [,2] 
[1,] -0.2327958 0.76093047 
[2,] -0.3636661 -0.18991299 
[3,] -0.8729468 0.58214118 
[4,] 0.8017349 -0.59781909 
[5,] -0.2230380 -0.08296606 

Si mat1 avait en fait autant d'éléments dans ses rangs comme mat2 avaient dans sa seule colonne (comme suggèrent vos mots), vous ajuster légèrement cette

mat1 <- matrix(rnorm(10), nrow=2, ncol=5) 
mat2 <- matrix(rnorm(5), nrow=5, ncol=1) 
mat1 * rep(mat2,nrow(mat1)) 
      [,1]  [,2]  [,3]  [,4]  [,5] 
[1,] -0.19818805 -0.05938007 -1.7792597 0.06937307 -0.7193403 
[2,] -0.05087793 0.10781853 0.2243285 -0.11416273 2.4063926 

ou dans la version de sarah

mat1 <- matrix(rnorm(10), nrow=5, ncol=2) 
mat2 <- matrix(rnorm(2), nrow=2, ncol=1) 
mat1 * rep(mat2,nrow(mat1)) 
      [,1]  [,2] 
[1,] 0.1528393 0.68646359 
[2,] 0.2420454 0.22987250 
[3,] -0.2592124 -0.07626098 
[4,] 0.4431273 0.27320838 
[5,] -0.1698307 0.47578667 
Questions connexes