Hallo ich habe eine Matrix die in einem std::vector linear abgespeichert ist. Nun möchte ich alle Zeilen der matrix löschen in denen eine Null vorkommt. Also beispiel: die matrix: 1 0 4 0 0 0 -2 1 2 0 3 2 0 0 0
das array sieht damit so aus: std::vector = 1 0 -2 0 0 0 0 1 3 0 4 0 2 2 0 ist also SPALTENWEISE gespeichert!
die ergebnismatrix sieht dann so aus: 1 0 4 -2 1 2 0 3 2
es wurden also zeile 1 und 4 gelöscht. der vector sieht so aus: std::vector = 1 -2 0 0 1 3 4 2 2
Irgendwie stelle ich mich da dumm an.
Mein code der das schonmal schafft sieht so aus wobei ich glaub das er sehr ineffizient ist. Für Vorschläge bin ich sehr dankbar!!!
C++:
int offset = 0; bool found = 0; for(int row = 0; row < nbr_Matrix_rows; row++) { for(int col = 0; col < y_dim; col++) { offset = col + row * y_dim; if (tmp_Matrix[offset] != 0) { erg_Matrix.push_back(tmp_Matrix[offset]); continue; } for(int r = 0; r < nbr_Matrix_rows; r++) if(tmp_Matrix[col + r * y_dim] != 0.0) found = 1; if(found) erg_Matrix.push_back(tmp_Matrix[offset]); found = 0; } }
Also, erst mal schreibst du "alle Zeilen löschen, in denen eine Null vorkommt". In dem Beispiel entfernst du aber die Zeilen, in denen nur Nullen vorkommen.
Dann: Ein Zeilenvektor (eindimensional) ist ein ungünstiger Datentyp, um eine Matrix (zweidimensional) zu bearbeiten. Du rechnest dir den Wolf mit Zeilen- und Spalten-Offsets. Warum nimmst du nicht vector<vector<int> >? Dann wirds einfacher.
Drittens: Die Aufgabe lässt sich sinnvoll zerlegen in zwei Teile: "Nullzeile finden" und "Eine Zeile entfernen". Du solltest daher zwei Routinen draus machen.