2011-04-15 22 views
9

Esto me molesta un poco:Multiplicación de matriz 3D con el vector

Supongamos que tiene una matriz con tres capas.

¿Hay una manera sencilla de multiplicar esta matriz con un vector de tres elementos de manera que la primera capa (todos los elementos) se multiplica con el primer elemento del vector y así sucesivamente ...

Ahora tengo utilizar una función para hacerlo de esta manera:

function out=fun(matrix,vector) 

out=matrix; 
for k=1:3 
    out(:,:,k)=out(:,:,k)*vector(k); 
end 

¿hay una manera eficiente de hacer esto en una sola línea sin la necesidad de una función?

Respuesta

17

Una solución muy concisa es reshapevector en una matriz de 1-por-1-a-3 y utilizar la función BSXFUN para llevar a cabo la multiplicación elemento a gota (se replicará dimensiones según sea necesario para que coincida con los tamaños de los dos argumentos de entrada):

newMatrix = bsxfun(@times,matrix,reshape(vector,[1 1 3])); 
+0

¡Exactamente lo que quería, gracias! – shant

+1

desearía poder volver a felicitarte una vez más por "mendigo representante" :) Sorprendentemente, Jonas y otra persona hicieron un comentario similar hoy y he tenido que recordarle a la gente sobre la etiqueta algunas veces en el pasado. Ciertamente parece que ha habido una afluencia de preguntadores de preguntas de una sola vez que abandonan el campo una vez que se resuelve el problema. Pero entonces, no he estado aquí el tiempo suficiente, así que esto podría ser normal. – abcd

+0

@yoda: Sí, es bastante común ver a los usuarios que pasan por ahí y que publican una vez y nunca regresan. No se puede hacer mucho al respecto. Sin embargo, cuando veo a un nuevo usuario que hace algunas preguntas razonables y bien formuladas, da buenas opiniones sobre los comentarios y generalmente se comporta de manera positiva, creo que vale la pena * señalar con cuidado * algunas de las preguntas frecuentes que detallan más el funcionamiento interno de SO. Me imagino que es más probable que regresen si aprenden más al respecto, y necesitamos más usuarios así. – gnovice

2

Hay una función de Matlab denominada repmat que va a ayudarle en esto.

M = [1 2 3] 
M * repmat([1 2 3], 3,1) 
ans = 

6 12 18 
6 12 18 
6 12 18 

M = [1 2 3] 
M .* repmat([1 2 3], 3,1) 
ans = 

1  4  9 
1  4  9 
1  4  9 

Dependiendo de cómo exactamente desea organizar sus matrices.

1

Otra manera es repetir el vector para que coincida con la matriz por tamaño:

out = out.*shiftdim(repmat(vector(:),[1 size(out(:,:,1))]),1) 
1

Además de gnovice de answer, también se puede replicar su vector a lo largo de las otras dimensiones y hacer un elemento de multiplicación directa sabia.

A=randn(1000,1000,3);%# this is your matrix 
vector=[1,2,3];%# this is your vector 

[dim1 dim2 ~]=size(A); 
replicatedVector=repmat(reshape(vector,1,1,3),[dim1,dim2,1]); 
out=A.*replicatedVector;