Angenommen, ich habe in MATLAB eine Matrix A
der Dimension Nx(N-1)
, z. B.
Ich möchte A
in eine NxN
matrix B
umwandeln, indem ich einfach eine Diagonale von Nullen einfüge, d. h.
Dieser Code macht was ich will:
%Vor%Könnten Sie eine effiziente Methode zur Vektorisierung vorschlagen?
Sie können dies mit oberen und unteren dreieckigen Teilen der Matrix tun ( triu
und tril
).
Dann ist es eine 1-Linien-Lösung:
%Vor%Bearbeiten: Benchmark
Dies ist ein Vergleich der Loop-Methode, der beiden Methoden in Sardars Antwort und meiner obigen Methode.
Benchmark-Code, mit timeit
für Timing und direkt heben Code aus Fragen und Antworten:
Ergebnisse:
Schlussfolgerungen:
find
für große Matrizen ist wichtig und spart ca. 35% Bearbeitungszeit zwischen Sardars Methoden. Erzeuge eine Matrix mit Nullen bei Diagonalen und Einsen bei Nicht-Diagonalindizes. Ersetzen Sie die nicht diagonalen Elemente durch die Transponierung von A
(da MATLAB die Spaltenhaupte ist). Transponiere erneut, um die richtige Reihenfolge zu erhalten.
Bearbeiten:
Als vorgeschlagen von Wolfie für den gleichen Algorithmus, du kann die Umwandlung in double
und die Verwendung von find
mit:
Tags und Links matlab matrix vectorization