16 Stimmen

Wie erhält man eine Diagonalmatrix aus einem Vektor?

Ich habe eine Kolumne:

0.0677
0.0584
0.0487
0.0453
0.0394

Welche Anweisung würde die folgende Ausgabe ergeben

0.0677   0          0         0          0
0        0.0584     0         0          0
0        0          0.0487    0          0
0        0          0         0.0453     0
0        0          0         0          0.0394

5 Stimmen

Können Sie Ihre MATLAB-Installation überprüfen, da ich glaube, dass es ein Problem mit den installierten Hilfedateien gibt? Ich habe gerade "diagonal vector" in den MATLAB-Hilfedialog eingegeben und das allererste Beispiel auf der allerersten Seite ist dieses Beispiel mit der Verwendung von diag().

3 Stimmen

@cMinor Danke, dass Sie das hier gefragt haben, diese Frage war für mich nützlich.

25voto

Diag ist die normale MATLAB-Lösung (wie von posdef hervorgehoben).

D = diag(vec);

ergibt eine Matrix mit Diagonalelementen nach Bedarf.

In manchen Anwendungen ist es vielleicht besser, eine dünnbesetzte Matrix zu erstellen, da eine Diagonalmatrix recht dünnbesetzt ist. Bei der Multiplikation von Matrizen hilft dies, die Zahl der unnötigen Operationen zu verringern.

n = length(vec);
D = spdiags(vec(:),0,n,n);

Wenn Sie die Zuordnung wirklich in expliziter Form vornehmen wollen, verwenden Sie einen einzelnen linearen Index wie diesen:

n = length(vec);
D = zeros(n);
D(cumsum([1,repmat(n+1,1,n-1)])) = vec;

Oder Sie können die Funktion sub2ind verwenden, um eine Reihe von Indizes in einen einzigen Index umzuwandeln.

0 Stimmen

@woodchips: Ich denke diag gibt eine spezielle Art von Matrix zurück. Sie können überprüfen, wie viele Bytes tatsächlich verwendet werden, indem Sie whos("D") . Danke

0 Stimmen

@eat: Nein, diag gibt ein Array der gleichen Klasse wie der ursprüngliche Vektor zurück. Wenn der Vektor also ein double ist das resultierende Array von der Klasse double auch.

1 Stimmen

@woodchips: Um den linearen Index zu erstellen, kann es einfacher sein, zu schreiben 1:(n+1):n^2 - keine Notwendigkeit für cumsum y repmat

13voto

posdef Punkte 6366

Wenn ich mich richtig erinnere, gibt es einen Befehl, der in etwa so heißt diag(A)

Edit : Bitte sehr, eine Dokumentation über das diag http://www.mathworks.com/help/techdoc/ref/diag.html

Achten Sie besonders auf das Zitat:

X = diag(v) setzt v auf die Hauptdiagonale, wie oben mit k = 0.

3voto

afp_2008 Punkte 1726

Es ergibt sich die folgende Diagonalmatrix D dessen Diagonale der Vektor vec . Sie ist in MATLAB in vektorisierter Form geschrieben.

D      = zeros(numel(vec));
[I,J]  = ind2sub(size(D),1:numel(D));
ind    = [I(:) J(:)];
ind    = find(ind(:,1)==ind(:,2));
D(ind) = vec;

1voto

Biggles Punkte 1284

Nun, offensichtlich kann man das auf eine C-ähnliche Weise tun. Im Moment kann ich nicht herausfinden, eleganter Lösung.

vector;%Your vector
vec_length = length(vector);
A = zeros(vec_length);
for i=1:vec_length
   A(i,i)  = vector(i);
end;

5 Stimmen

Das Einzige, was ich nicht tun würde, ist, eine Schleife zu verwenden. Das ist nicht der richtige Weg, um in MATLAB zu denken. Lernen Sie stattdessen, in Form von Matrizen und Vektoren in einzelnen Operationen zu denken.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X