Vector In Matrix Syntax in MATLAB
Frage
Gibt es eine Möglichkeit 2 Vektoren in MATLAB zu kombinieren, so dass:
mat = zeros(length(C),length(S));
for j=1:length(C)
mat(j,:)=C(j)*S;
end
Mit normaler MATLAB-Syntax ähnelt:
mat = C * S(1:length(S))
Dies ergibt eine „innere Matrix Dimensionen müssen Fehler stimmen“, weil es normal, Matrix-Operationen zu tun versucht. Dies ist kein Standard Linear Algebra Betrieb so dass ich nicht sicher bin, wie richtig es in MATLAB ausdrücken, aber es scheint, wie es möglich sein soll, eine Schleife, ohne dass, die in MATLAB übermäßig langsam ist.
Lösung
Aus Ihrer Beschreibung, es klingt wie eine einfache Matrix-Operation. Sie müssen nur sicherstellen, dass Sie die richtigen Dimensionen für haben C und S . C sollte einen Spaltenvektor ( Länge (C) -Durch-1) und S sollte einen Zeilenvektor (1-by- < strong> Länge (S) ). Unter der Annahme, ihnen die richtigen Abmessungen, nur Folgendes tun:
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 nicht erforderlich, da es keine Ordnung-of-Operation Anliegen sind. Hier ist eine sauberere Version:
mat = C(:)*S(:)';
ERKLÄRUNG:
Die Matrixmultiplikation Operator in MATLAB wird produzieren, entweder eine Skalarprodukt (in einem skalaren Wert führt) oder eine äußere Produkt (resultierend in einer Matrix) in Abhängigkeit von den Dimensionen der Vektoren sie angewendet wird.
Die letzte Gleichung oben erzeugt ein äußeres Produkt aufgrund der Verwendung des Doppelpunkt-Operator die Dimensionen der Vektor Argumente neu zu gestalten. Die Syntax C (:) umformt den Inhalt von C in einen einzigen Spaltenvektor. Die Syntax S (:) umformt den Inhalt von S in einen Spaltenvektor, transponiert dann in einem Zeilenvektor. Wenn multipliziert, führt dies zu einer Matrix der Größe ( Länge (C) -by- Länge (S) ).
Hinweis: Diese Verwendung des Doppelpunkt-Operator ist anwendbar auf Vektoren und Matrizen jeder Dimension, so dass Sie ihren Inhalt in einer einzigen Spalte Vektor neu zu gestalten (was einige Operationen erleichtert, wie
Andere Tipps
Versuchen Sie, diese in MATLAB ausführen:
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
Haben Sie das folgende bedeuten?
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
sind Zeilenvektoren oder Spaltenvektoren, können Sie einen Trick verwenden, können sie in Spaltenvektoren zu drehen, dann S
transponieren, bevor sie multiplizieren:
C(:) * S(:)'
ich nicht ganz klar ist, was Sie tun - es sieht aus wie Ihre resultierende Matrix aus length(C)
Zeilen bestehen, wo die i
th Reihe der Vektor S
durch den i
th Eintrag von C
skaliert ist (da ein Vektor-Indizierung ein gibt Skalar). In diesem Fall können Sie tun so etwas wie
mat = repmat(C,[1 length(S)]) .* repmat(S, [length(C) 1])
, wo Sie Kachel C
über Spalten und S
unten Reihen.
Versuchen Sie folgendes:
C = 1: 3 S = 1: 5 mat1 = C '* S
= MAT2 bsxfun (@times, C‘, S)
(insb. Gut, wenn die Funktion, die Sie brauchen nicht einfacher MATLAB-Notation)
- Loren
meshgrid mit:
[Cm, Sm] = meshgrid(C, S);
mat = Cm .* Sm;
edit: vergiss es, Matrixmultiplikation wird auch tun. Sie müssen nur ein Spaltenvektor C und einen Zeilenvektor S. tun dann C * S.