Wie schreibt man Array von Zeilenreihenfolge in Spaltenreihenfolge?

7

Ich habe diese doppelte for-Schleife, wo ich Array-Indizierung sowohl in Zeilenreihenfolge als auch in Spaltenreihenfolge durchführen kann, was die Performance beeinträchtigen sollte.

%Vor%

Gibt es einen Ansatz / Methode, wie man von einem zum anderen umschreiben kann?

Wenn ich versuche, die letzte Spaltenreihenfolge neu zu schreiben, werden die Daten verzerrt. Kann es nicht neu geschrieben werden?

Sandra

    
Sandra Schlichting 30.01.2010, 13:58
quelle

5 Antworten

3

Das wird niemals sehr schnell gehen, da Sie wahrscheinlich eine Reihe von Cache-Fehlern haben werden. Sie müssen entweder zu der einen Matrix mit einer großen Tonhöhe oder zu der anderen gehen, da gibt es kein Entkommen. Das Problem hierbei ist, dass ein Computer aufeinanderfolgende Speicherzugriffe bevorzugt, um nahe beieinander zu sein, was in Ihrem Algorithmus nicht der Fall ist, dass die Indexierung von array_a aufgrund des col height-Terms gleichzeitig nach Höhenelementen überspringt. Um das zu beheben, könntest du die Schleifen umdrehen, aber dann hättest du das gleiche Problem mit dem Begriff width (height-1 -row) in array_b.

Sie könnten eines der Arrays so umschreiben, dass es der Reihenfolge des anderen entspricht, aber dann haben Sie genau das gleiche Problem im Code, das das Neuschreiben ausführt, also kommt es darauf an, ob Sie diese Art von Sache mehr als tun müssen Wenn Sie einmal auf denselben Daten sind, macht es Sinn, zuerst eine der beschriebenen Matrizen wie Poita_ zu schreiben, andernfalls sollten Sie den Algorithmus lieber unverändert belassen.

    
wich 30.01.2010, 14:39
quelle
12

Da die Frage mit C ++ etikettiert ist, werde ich eine Antwort geben, die zeigt, wie der Zugriff / die Manipulation von Spalten-Hauptmatrizen mit Boost.Multiarray (kann für andere nützlich sein, die ein ähnliches Problem haben). Ich halte Boost für eine Erweiterung der C ++ - Standardbibliothek. Fühlen Sie sich frei, diese Antwort zu ignorieren, wenn Sie Boost nicht mögen / verwenden. : -)

%Vor%

Ausgabe:

%Vor%

Wie Sie sehen können, können Sie die Quelldaten in ihrem Spalten-Hauptformat belassen und boost::multi_array_ref mit benutzerdefinierten Speicherspezifikationen verwenden, um die Daten direkt (wie in der Hauptreihe) mit der matrix[row][col] -Notation zu bearbeiten .

Wenn die Matrix häufig in Reihen-Haupt-Weise durchlaufen wird, dann ist es möglicherweise besser, sie in eine tatsächliche Reihen-Haupt-Matrix zu transponieren, wie im letzten Teil meines Beispiels gezeigt.

    
Emile Cormier 31.01.2010 01:15
quelle
3

Sie möchten also von etwas wie:

wechseln %Vor%

bis

%Vor%

?

Versuchen Sie

%Vor%     
Peter Alexander 30.01.2010 14:12
quelle
3

Wenn Sie die Reihenanordnung ändern, schreiben Sie Ihre eigene Array-Klasse.

Die Daten müssen nicht wirklich verschoben werden, nur die Schnittstelle, die auf die Daten zugreift, muss wissen, wie sie auf die Daten zugreifen kann.

%Vor%     
Martin York 30.01.2010 20:16
quelle
2

Ist das nicht der Grund für Ihre Datenverschiebung? Alle negativen Werte werden auf Null gesetzt:

%Vor%     
TheDon 30.01.2010 14:04
quelle

Tags und Links