Angenommen, ich repräsentiere eine Matrix foo
von Werten mit std::vector
:
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:
Anders ausgedrückt, kann ich foo so "transponieren", dass die folgenden drei Dinge zutreffen:
%Vor% 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:
Das rufe ich an:
%Vor%Es ist nur in einem speziellen Fall kam ich auf eine Situation, die tun müssen:
%Vor%Es gibt eine naheliegende for-loop-Lösung, aber ich war auf der Suche nach etwas, das robuster und effizienter ist.
Wie ich in den Kommentaren erwähnt habe, ist es aus mehreren Gründen nicht praktikabel, Matrizen mit vektoriellen Vektoren darzustellen:
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:
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ß.