2009-06-23 15 views
2

Est-il possible de combiner 2 vecteurs dans Matlab tels que:Vector à la matrice syntaxe dans Matlab

mat = zeros(length(C),length(S)); 
for j=1:length(C) 
    mat(j,:)=C(j)*S; 
end 

Utilisation de la syntaxe normale de Matlab similaire à:

mat = C * S(1:length(S)) 

Cela donne une « dimension de la matrice intérieure doit être d'accord erreur "parce qu'il essaie de faire des opérations matricielles normales. Ce n'est pas une opération standard d'algèbre linéaire, donc je ne sais pas comment l'exprimer correctement dans MATLAB, mais il semble que cela devrait être possible sans nécessiter de boucle, ce qui est excessivement lent dans MATLAB.

+1

Je pense que vous avez une faute de frappe. La ligne "mat (1, :) = ..." va simplement continuer à écraser la première ligne, ne faisant rien aux lignes restantes. Voulez-vous dire "mat (j, :) = ..." à la place? – gnovice

+0

Oui, vous avez raison, ça aurait dû être mat (j, :). Désolé pour ça. – NoMoreZealots

+0

Pas de problème. Je l'ai réparé pour éviter toute confusion supplémentaire. =) – gnovice

Répondre

5

D'après votre description, cela ressemble à une simple opération de matrice. Vous devez juste vous assurer que vous avez les bonnes dimensions pour C et S. C doit être un vecteur de colonne (longueur (C) -en-1) et S doit être un vecteur ligne (longueur 1 par cas (S)). Si l'on suppose qu'ils sont les bonnes dimensions, il suffit de faire ce qui suit:

mat = C*S; 

Si vous n'êtes pas sûr de leurs dimensions, cela devrait fonctionner:

mat = (C(:))*(S(:)'); 

EDIT: En fait, je suis allé un peu fou avec les parenthèses. Certains d'entre eux sont inutiles, car il n'y a pas de problèmes d'ordre de fonctionnement. Voici une version plus propre:

mat = C(:)*S(:)'; 

EXPLICATION:

Le matrix multiplication operator en Matlab produira soit un inner product (résultant en une valeur scalaire) ou un outer product (résultant dans une matrice) en fonction les dimensions des vecteurs auxquels il est appliqué.

La dernière équation ci-dessus produit un produit externe en raison de l'utilisation du colon operator pour remodeler les dimensions des arguments vectoriels. La syntaxe C (:) remodèle le contenu de C en un vecteur à colonne unique. La syntaxe S (:) ' remodèle le contenu de S en un vecteur colonne, puis le transpose en vecteur ligne. Lorsque multiplié, ceci résulte en une matrice de taille (longueur (C) -par- longueur (S)).

Note: Cette utilisation de l'opérateur du côlon est applicable aux vecteurs et matrices de toute dimension, vous permettant de remodeler leur contenu dans un vecteur de colonne unique (ce qui rend certaines opérations plus faciles, comme le montre this other SO question).

+0

Pourquoi l'expression du bas produit-elle des résultats différents de l'expression du haut? Il semblerait que C = C (:). Il y a quelque chose de subtil qui se passe ici que je ne comprends pas. – NoMoreZealots

+0

@Pete: Je vais ajouter une explication à la réponse pour la rendre plus claire. – gnovice

+0

J'ai lu votre explication et pensé, si ce que vous dites est correct, alors C '* S devrait travailler et voilà. Donc le vrai problème est juste l'ordre dans lequel le vecteur colonne est multiplié avec le vecteur ligne. Doux. Merci. – NoMoreZealots

4

Essayez d'exécuter ceci dans Matlab:

mat = C*S' 

comme dans:

C = [1; 2; 3]; 
S = [2; 2; 9; 1]; 

mat = zeros(length(C),length(S)); 
for j=1:length(C) 
    mat(j,:)=C(j)*S; 
end 

% Equivalent code: 
mat2 = C*S'; 

myDiff = mat - mat2 
0

Essayez d'utiliser meshgrid:

[Cm, Sm] = meshgrid(C, S); 
mat = Cm .* Sm; 

modifier: Nevermind, multiplication matricielle fera aussi. Vous avez juste besoin d'un vecteur de colonne C et d'un vecteur de ligne S. Alors faites C * S.

1

Je ne suis pas tout à fait clair sur ce que vous faites - il semble que votre matrice résultante se composera de length(C) lignes, où le i cette ligne est le vecteur S mis à l'échelle par l'entrée i de C (puisque l'inscription d'un vecteur donne un scalaire). Dans ce cas, vous pouvez faire quelque chose comme

mat = repmat(C,[1 length(S)]) .* repmat(S, [length(C) 1]) 

où vous tuiles C à travers des colonnes et des lignes S vers le bas.

2

Voulez-vous dire ce qui suit?

mat = zeros(length(C),length(S)); 
for j=1:length(C) 
    mat(j,:)=C(j)*S; 
end 

Si oui, il est simplement la multiplication de la matrice:

C' * S % if C and S are row vectors 
C * S' % if C and S are column vectors 

Si vous ne savez pas si C et S sont des vecteurs de ligne ou des vecteurs de colonne, vous pouvez utiliser une astuce pour les transformer en vecteurs de colonne , puis transposer S avant de les multiplier:

C(:) * S(:)' 
1

Essayez ceci:

C = 1: 3 S = 1: 5 MAT1 = C '* S

mat2 = bsxfun (@times, C', S)

(esp. bien quand la fonction dont vous avez besoin est pas plus simple notation Matlab)

--Loren

Questions connexes