Erhalte die erste Spalte einer Matrix, die durch einen Vektor von Vektoren dargestellt wird

8

Angenommen, ich repräsentiere eine Matrix foo von Werten mit std::vector :

%Vor%

Gibt es einen cleveren einfachen Weg für mich, um ein vector<int> der Größe rows zu erhalten, das die erste "Spalte" von foo enthält:

%Vor%

Anders ausgedrückt, kann ich foo so "transponieren", dass die folgenden drei Dinge zutreffen:

%Vor%

Hinweis zur Klärung

Es gibt ein paar gute Vorschläge für alternative Möglichkeiten, eine "Matrix" darzustellen. Wenn ich den Begriff "Matrix" verwende, meine ich einfach, dass jede der zweiten Ebene vector die gleiche Größe hat. Ich möchte nicht vorschlagen, dass ich diese Datenstruktur für die Operation der linearen Algebra verwenden werde. Ich brauche tatsächlich einen Vektor von Vektoren oder eine Datenstruktur, aus der man 1D-Vektoren "herausziehen" kann, weil ich Funktionen habe, die auf Vektoren wie:

operieren %Vor%

Das rufe ich an:

%Vor%

Es ist nur in einem speziellen Fall kam ich auf eine Situation, die tun müssen:

%Vor%

Für Schleifenlösung

Es gibt eine naheliegende for-loop-Lösung, aber ich war auf der Suche nach etwas, das robuster und effizienter ist.

    
Alan Turing 03.04.2013, 03:30
quelle

1 Antwort

17

Wie ich in den Kommentaren erwähnt habe, ist es aus mehreren Gründen nicht praktikabel, Matrizen mit vektoriellen Vektoren darzustellen:

  1. Es ist fummelig einzurichten;
  2. Es ist schwer zu ändern;
  3. Die Cache-Lokalität ist schlecht.

Hier ist eine sehr einfache Klasse, die ich erstellt habe und die eine 2D-Matrix in einem einzelnen Vektor enthält. Das ist so wie Software wie MATLAB es tut ... wenn auch eine große Vereinfachung.

%Vor%

Bei dieser Klasse handelt es sich im Grunde um eine einzelne Funktion - StridedSlice . Die Umsetzung davon ist:

%Vor%

Und der Rest ist ziemlich geradlinig:

%Vor%

Beachten Sie, dass die Funktionen Row und Column so eingerichtet sind, dass Sie problemlos eine ganze Zeile oder Spalte anfordern können, aber ein wenig leistungsfähiger sind, da Sie einen Bereich teilen können, indem Sie ein oder zwei weitere übergeben Parameter. Und ja, Sie können die Zeile / Spalte umgekehrt zurückgeben, indem Sie Ihren Startwert größer als Ihren Endwert machen.

In diesen Funktionen sind keine Grenzen eingebaut, aber Sie können dies leicht hinzufügen.

Sie könnten auch etwas hinzufügen, um ein Bereichs-Slice als ein anderes SimpleMatrix<T> zurückzugeben.

Viel Spaß.

    
paddy 03.04.2013, 22:44
quelle

Tags und Links