10
votes

Multiplication de matrice 3D avec vecteur

Cela me dérange un peu:

Supposons que vous ayez une matrice avec trois couches. p>

existe un moyen simple de multiplier cette matrice avec un vecteur de trois éléments afin que la première couche (tout Les éléments) sont multipliés avec le premier élément du vecteur et ainsi de suite ... p>

Maintenant, je dois utiliser une fonction pour le faire comme ceci: P>

function out=fun(matrix,vector)

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


0 commentaires

4 Réponses :


17
votes

Une solution très terres est de Remodeler Vecteur dans une matrice 1 by-1-by-3 et utilisez la fonction BSXFun pour effectuer la multiplication d'éléments-sages (il reproduira les dimensions nécessaires pour correspondre aux tailles des deux arguments d'entrée):

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


3 commentaires

J'aimerais que je puisse vous uplifier une fois de plus pour "Rep Beggar" :) Étonnamment, Jonas et quelqu'un d'autre avaient un commentaire similaire aujourd'hui et j'ai dû rappeler aux gens d'étiquette à quelques reprises dans le passé. Il semble certainement que cela semble être un afflux d'adresseurs de questions ponctuelles qui abandonnent le terrain une fois que la question est résolue. Mais alors, je n'ai pas été là assez longtemps, cela pourrait donc être normal.


@YODA: Oui, il est assez courant de voir les utilisateurs de conduite par les utilisateurs qui publient une fois et ne reviennent jamais. Ne peut pas faire beaucoup à ce sujet. Cependant, lorsque je vois un nouvel utilisateur qui pose quelques questions bien écrites sensibles, donne de bons commentaires sur les commentaires et se comporte généralement de manière positive, je pense que cela vaut doucement les pointer vers certains FAQ plus du fonctionnement intérieur de si. Je pense qu'ils peuvent être plus susceptibles de revenir s'ils en apprennent davantage à ce sujet et nous avons besoin de plus d'utilisateurs comme ça.


D'accord, et j'aime la façon dont vous l'avez dirigé dans la bonne direction. Je vais voler que pour une utilisation future :)



2
votes

Il y a une fonction MATLAB appelée repmat qui vous aidera à cela. XXX

Selon la façon dont vous souhaitez organiser vos matrices.


0 commentaires

1
votes

Un autre moyen est de répéter le vecteur pour correspondre à la matrice par taille:

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


0 commentaires

1
votes

En plus de Gnovice's Réponse , vous pouvez également reproduire votre Vecteur le long des autres dimensions et effectuez une multiplication sage d'élément direct.

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;


0 commentaires