2009-06-23 8 views
2

Gibt es eine Möglichkeit 2 Vektoren in MATLAB zu kombinieren, so dass:Vector In Matrix Syntax in MATLAB

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

normale MATLAB-Syntax ähnelt:

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

Dies ergibt eine „innere Matrix Dimensionen muss dem Fehler zustimmen, "weil er versucht, normale Matrixoperationen durchzuführen. Dies ist keine standardmäßige Operation der linearen Algebra, daher bin ich mir nicht sicher, wie ich sie in MATLAB richtig ausdrücken soll, aber es scheint so, als ob sie möglich wäre, ohne eine Schleife zu benötigen, die in MATLAB übermäßig langsam ist.

+1

Ich glaube, Sie haben einen Tippfehler. Die Zeile "mat (1, :) = ..." wird einfach die erste Zeile überschreiben und den restlichen Zeilen nichts anhaben. Meinst du stattdessen "mat (j, :) = ..."? – gnovice

+0

Ja, du hast Recht, es hätte Mat sein sollen (j, :). Das tut mir leid. – NoMoreZealots

+0

Kein Problem. Ich habe es behoben, um weitere Verwirrung zu vermeiden. =) – gnovice

Antwort

5

Aus Ihrer Beschreibung, es klingt wie eine einfache Matrix-Operation. Sie müssen nur sicherstellen, dass Sie die richtigen Abmessungen für C und S haben. C sollte ein Spaltenvektor sein (Länge (C) -Durch-1) und S sollte einen Zeilenvektor (1-by- Länge (S)) sein. Unter der Annahme, sie die richtigen Dimensionen sind, tun gerade folgendes:

mat = C*S; 

Wenn Sie nicht sicher von ihren Dimensionen sind, sollte diese Arbeit:

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

EDIT: Eigentlich ging ich ein wenig verrückt mit den Klammern. Einige von ihnen sind unnötig, da es keine Bedenken bezüglich der Betriebsordnung gibt. Hier ist eine sauberere Version:

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

ERKLÄRUNG:

Die matrix multiplication operator in MATLAB produzieren entweder eine inner product (was zu einem skalaren Wert) oder eine outer product (was zu einer Matrix), je nach die Dimensionen der Vektoren, auf die es angewendet wird.

Die letzte obige Gleichung erzeugt ein äußeres Produkt aufgrund der Verwendung der colon operator, um die Dimensionen der Vektorargumente umzuformen. Die Syntax C (:) formt den Inhalt von C in einen einzelnen Spaltenvektor um. Die Syntax S (:) ' formt den Inhalt von S in einen Spaltenvektor um und transponiert ihn dann in einen Zeilenvektor. Wenn dies multipliziert wird, ergibt dies eine Matrix der Größe (Länge (C)-by- Länge (S)).

Hinweis: Diese Verwendung des Doppelpunkt-Operators ist anwendbar auf Vektoren und Matrizen jeder Dimension, so dass Sie ihren Inhalt in einen einzigen Spaltenvektor neu zu gestalten (das einige Operationen erleichtert, wie this other SO question gezeigt).

+0

Warum erzeugt der untere Ausdruck andere Ergebnisse als der obere Ausdruck? Es scheint wie C = C (:). Es gibt etwas Subtiles, das hier vorgeht. Ich verstehe es nicht. – NoMoreZealots

+0

@Pete: Ich werde der Antwort eine Erklärung hinzufügen, um sie klarer zu machen. – gnovice

+0

Ich lese deine Erklärung und dachte, wenn das, was du sagst, richtig ist, DANN sollte C * S funktionieren und siehe da. Das eigentliche Problem ist also nur die Reihenfolge, in der der Spaltenvektor mit dem Zeilenvektor multipliziert wird. Süss. Vielen Dank. – NoMoreZealots

4

Versuchen Sie, diese in MATLAB Ausführung:

mat = C*S' 

Wie in:

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

Try meshgrid mit:

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

edit: vergiss, wird die Matrixmultiplikation tun. Sie brauchen nur eine Spalte Vektor C und eine Zeile Vektor S. Dann tun C * S.

1

Ich bin nicht ganz klar auf, was Sie tun - es sieht aus wie Ihre resultierende Matrix besteht aus length(C) Zeilen, wo die i th Zeile ist der Vektor S skaliert durch die i th Eintrag C (seit Subskribierung eines Vektors ergibt einen Skalar). In diesem Fall können Sie so etwas wie

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

wo Sie Fliese C über Spalten und S unten Reihen tun.

2

Meinst du folgendes?

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

Wenn ja, es ist einfach Multiplikation Matrix:

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

Wenn Sie nicht wissen, ob C und S Zeilenvektoren oder Spaltenvektoren sind, können Sie einen Trick verwenden, können sie in Spaltenvektoren drehen transponieren, dann S bevor sie multiplizieren:

C(:) * S(:)' 
1

Try this:

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

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

(spez. gut, wenn die Funktion, die Sie brauchen nicht einfacher MATLAB-Notation) ist

--Loren