2011-11-08 11 views
18

He siguiente problema:R: matriz por multiplicación vector

myvec <- c(1:3) 

mymat <- as.matrix(cbind(a = 6:15, b = 16:25, c= 26:35)) 
mymat 
     a b c 
[1,] 6 16 26 
[2,] 7 17 27 
[3,] 8 18 28 
[4,] 9 19 29 
[5,] 10 20 30 
[6,] 11 21 31 
[7,] 12 22 32 
[8,] 13 23 33 
[9,] 14 24 34 
[10,] 15 25 35 

Quiero multiplicar el mymat con myvec y construir nuevo vector de tal manera que

sum(6*1, 16*2, 26*3) 
sum(7*1, 17*2, 27*3) 

.................... 
sum(15*1, 25*2, 35*3) 

Lo sentimos, esto es simple pregunta que I no sé ...

Editar: errata corregida

Respuesta

33

El %*% operador en I hace la multiplicación de matrices:

> mymat %*% myvec 
     [,1] 
[1,] 116 
[2,] 122 
... 
[10,] 170 
1

Si desea un resultado vectorial en lugar de como resultado una matriz como la salida, se podría también utilizar ..

apply(mymat*myvec,1,sum) 

Un poco más de una solución rotonda que Owen, pero funciona.

+1

O 'c (mymat% *% myvec)' producirá un vector – Owen

+1

No, no funciona, las matrices se almacenan en orden de columnas principales, por lo que debe transponerlas antes de poder aplicar operaciones en filas (por lo en realidad aplicas operaciones en columnas en tu matriz). Eso sería 'apply (t (mymat) * myvec, 1, sum)' – Calimo

0

Las matrices son vectores con el fin principal de la columna:

colSums( t(mymat) * myvec) 

(Editado después de esperar la lectura pregunta correctamente este momento.)

+0

¿Por qué c() alrededor de toda la expresión? – thelatemail

+0

Quizás no sea necesario? La idea fue que termine como un vector. Pero esa idea parece excesivamente cautelosa. Lo dejaré caer. –

+0

Si la matriz se almacena en orden principal de columna, entonces necesita transponerla primero antes de aplicar una multiplicación en filas. 'colSums (t (mymat) * myvec)' – Calimo

0

Owen tiene toda la razón. El problema no era distinguir dot(scalar) y productos cruzados. para el producto escalar * y para el producto cruz %*% son operadores

0

Una alternativa, pero mucho más largo puede ser ésta:

rowSums(t(apply(mymat, 1, function(x) myvec*x)),na.rm=T) 

es la única forma que he encontrado que se puede ignorar NA del interior de la matriz.

Cuestiones relacionadas