000
01.11.2006, 23:29 Uhr
~testo
Gast
|
Hallo,
die folgende funktion die mit einer struct zusammenarbeitet frisst mir 70% meiner gesamten Laufzeit. Ich habe das mittels callgrind/kcachegrind unter debian linux geprofiled! Compiler: gcc3.4.3 (ich weiß - net der neueste)
Funktionsweise: Ich habe eine Matrix in einem vector gespeichert. Die werte sind von oben nach unten und nicht wie üblich von links nach rechts gespeichert - d.h. sie ist SPALTENWEISE gespeichert - d.h. zuerst die werte der ersten spalte, dann der zweiten usw. Jetzt möchte ich alle ZEILEN der matrix löschen in denen ALLE einträge Null sind. Dies ist schwieriger weil ich ja Spaltenweise gespeichert habe - daran ist leider nix zu ändern.
Mein versuch im moment ist dieser:
C++: |
void myClass::Lösche_alle_Nullzeilen(std::vector< double >& matrix, int& x_dim, int& y_dim, const int col, int& idx) { std::vector< bool > mask( y_dim ); for ( int y = 0; y < y_dim; ++y ) { mask[ y ] = true; if(y == col) { mask[ y ] = false; continue; } for ( int x = 0; x < x_dim; ++x ) { if ( matrix[ x * y_dim + y ] != 0 ) { mask[ y ] = false; break; } } } matrix.erase( std::remove_if( matrix.begin(), matrix.end(), IS_MASKED( matrix, mask ) ), matrix.end() ); y_dim = matrix.size() / x_dim; } //das struct sieht so aus: struct IS_MASKED { std::vector< bool > mask_; const std::vector< double >* erase_el_; IS_MASKED(const std::vector< double >& erase_el, const std::vector< bool >& mask) : erase_el_( &erase_el ), mask_( mask ) { } bool operator()(const double& f) const { return mask_[ ( &f - &*erase_el_->begin() ) % mask_.size() ]; } };
|
leider wie gesagt dauert das zu lange. Laut meinem callgraphen fressen die iteratoren die meiste Zeit weg - und das aus dieser obigen funktion. Das bedeutet doch aber dass nur das hier:
C++: |
matrix.erase( std::remove_if( matrix.begin(), matrix.end(), IS_MASKED( matrix, mask ) ), matrix.end() );
|
für das löschen verantworlich sein kann da nirgendwo sonst iteratoren in dieser funktion verwendet werden....
für änderungsvorschläge oder auch ideen wie man es besser realisieren könnte bin ich sehr dankbar!!! |