Einfügen von Diagonalen von Nullen in eine Matrix in MATLAB

8

Angenommen, ich habe in MATLAB eine Matrix A der Dimension Nx(N-1) , z. B.

%Vor%

Ich möchte A in eine NxN matrix B umwandeln, indem ich einfach eine Diagonale von Nullen einfüge, d. h.

%Vor%

Dieser Code macht was ich will:

%Vor%

Könnten Sie eine effiziente Methode zur Vektorisierung vorschlagen?

    
user3285148 08.12.2017, 11:26
quelle

2 Antworten

13

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:

%Vor%

Ergebnisse:

  • Sardar Methode 1: 2.83 secs
  • Sardar Methode 2: 1.82 secs
  • Meine Methode: 1,45 Sekunden
  • Schleifenmethode: 3,80 Sekunden (!)

Schlussfolgerungen:

  • Ihr Wunsch, dies zu vektorisieren, war gut begründet, das Schleifen ist viel langsamer als andere Methoden.
  • Die Vermeidung von Datenkonvertierungen und find für große Matrizen ist wichtig und spart ca. 35% Bearbeitungszeit zwischen Sardars Methoden.
  • Durch die Vermeidung der Indizierung zusammen können Sie eine weitere 20% Bearbeitungszeit speichern.
Wolfie 08.12.2017, 11:50
quelle
4

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.

%Vor%

Bearbeiten:

Als vorgeschlagen von Wolfie für den gleichen Algorithmus, du kann die Umwandlung in double und die Verwendung von find mit:

loswerden %Vor%     
Sardar Usama 08.12.2017 11:37
quelle

Tags und Links