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.

War es hilfreich?

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 diese andere Frage SO ).

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 ith Reihe der Vektor S durch den ith 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

Versuchen

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top