2011-04-15 5 views
9

Cela me dérange un peu:multiplication matricielle 3D avec le vecteur

Supposons que vous ayez une matrice avec trois couches.

est-il un moyen simple de multiplier cette matrice avec un vecteur de trois éléments de telle sorte que la première couche (tous les éléments) est multiplié par le premier élément du vecteur et ainsi de suite ...

Maintenant je d'utiliser une fonction pour le faire comme ceci:

function out=fun(matrix,vector) 

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

est-il un moyen efficace de le faire en une seule ligne sans la nécessité d'une fonction?

Répondre

17

Une solution très concise est de reshapevector en un 1-by-1-en-3 matrice et utiliser la fonction BSXFUN pour effectuer la multiplication élément par élément (il se répliquera dimensions selon les besoins pour correspondre à la taille des deux arguments d'entrée):

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

Exactement ce que je voulais, merci! – shant

+1

souhaite que je pourrais vous mettre une fois de plus en colère pour "rep mendier" :) Étonnamment, Jonas et quelqu'un d'autre a eu un commentaire similaire aujourd'hui et j'ai dû rappeler aux gens de l'étiquette quelques fois dans le passé. Il semble bien qu'il y ait eu un afflux de poseurs de questions ponctuelles qui abandonnent le champ une fois le problème résolu. Mais alors, je n'ai pas été ici assez longtemps, donc cela pourrait être normal. – abcd

+0

@yoda: Oui, il est assez fréquent de voir des utilisateurs de drive-by qui publient une fois et ne reviennent jamais. Je ne peux pas faire grand chose à ce sujet. Cependant, quand je vois un nouvel utilisateur qui pose quelques questions judicieuses bien écrites, donne de bons commentaires sur les commentaires, et se comporte généralement d'une manière positive, je pense qu'il vaut la peine de les pointer vers des FAQ détaillant plus des mécanismes internes de SO. Je pense qu'ils auront plus de chances de revenir s'ils en apprennent plus, et nous avons besoin de plus d'utilisateurs comme ça. – gnovice

2

Il y a une fonction Matlab appelée repmat qui va vous aider dans ce domaine.

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 

Selon la manière dont vous souhaitez organiser vos matrices.

1

Une autre façon est de répéter vecteur pour correspondre à la matrice par taille:

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

En plus de answer de gnovice, vous pouvez également reproduire votre vecteur le long des autres dimensions et faire un élément directe multiplication sage.

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; 
Questions connexes