Matrix & Iterator



  • Hallo Leutz,

    ich hab viel mit Matrizen zu tun.

    vector<double> value;
    	vector<vector<double>> matrix;
    
    	for(int i = 0; i < 10; ++i)
    		value.push_back(i);
    	for(int i = 0; i < 5; ++i)
    		matrix.push_back(value);
    

    Um auf die einzelnen Elementen zuzugreifen habe ich stinknormale for-Schleifen benutzt. Wie z.B.

    for(int row = 0; row < matrix.size(); ++row){
    		for(int column = 0; column < matrix.at(row).size(); ++column)
    			cout << matrix.at(row).at(column) << '\t';
    		cout << endl;
    	}
    

    Letztens habe ich wat über Iteratoren gelesen und wollte einfach ma los programmieren.

    Resultat:

    vector<vector<double>>::iterator it_row;
    	vector<double>::iterator it_column;
    
    	for(it_row = matrix.begin(); it_row < matrix.end(); ++it_row)
    		for(it_column = matrix.at(it_row).begin(); it_column matrix.at(it_row).end(); ++it_column)
    			cout << *it_column << '\t';
    	cout << endl;
    

    Naja, das funktioniert natürlich nicht! Ehrlich gesacht, kam ich schon ab der zweiten for-Schleife ins schwitzen.
    Könnt ihr mir da Tipps geben und würdet ihr mir empfehlen weiter mir Iteratoren zu arbeiten? Wenn ja, warum? Bzw wo liegt da der Vorteil.

    tausend Dank im voraus 😃



  • Wenn du mit den Iteratoren nicht klar kommst, dann benutz halt Indexzugriffe. Kann so oder so noch von Vorteil sein, weil man ja oft auch den Index braucht.

    Aber im übrigen würde ich sowieso nicht das benutzen, um eine Matrix darzustellen, sondern eher eine Library dazu benutzen. Vor allem mit den richtigen Algorithmen kannst du da viel Zeit sparen.



  • @schickano:

    Warum erhoehst du den Index vor betreten der for-Schleife? Was geht ueberhaupt schief?

    Ich schliesse mich drakon an, es gibt bereits vorgefertigte Bibliotheken fuer lineare Algebra. Du kannst dir aber natuerlich auch selbst eine Matrixklasse schreiben, allerdings wuerde ich zwecks Performance eher zu Arrays tendieren. Kommt natuerlich immer darauf an, was du bezweckst.
    @Indexzugriff: Da wuerde ich noch eher die .at() Methode empfehlen, die wirft immerhin eine exception, wenn man ueber den Vector hinausliest.

    Edit: Ich sehe grade, dass du per .at() in der zweiten for-Schleife auf das erste Element zugreifst. Du kannst doch einfach den Iterator der ersten for-Schleife nehmen und per ->at() auf sein erstes Element zugreifen.



  • Corsair@01: der Index wird doch gar nicht vorher erhöht!?

    Und hier die richtige Version:

    vector<vector<double>>::iterator it_row;
    vector<double>::iterator it_column;
    
    for(it_row = matrix.begin(); it_row < matrix.end(); ++it_row)
        for(it_column = it_row->begin(); it_column < it_row->end(); ++it_column)
            cout << *it_column << '\t';
    cout << endl;
    

    Aber ich würde auch zu einer vorgefertigten Matrizen-Klasse raten, anstatt selber damit herumzuhantieren.



  • Abstrahiere von vector<vector<double> > und baue eine eigene Matrixklasse. Implementiere double& operator()(int i, int j) und nutze ein Matrixobjekt aehnlich der mathematischen Notation z.B. m(1,3).



  • Ok ich sehe die Tendenz neigt zu vorgefertigten Libraries,
    habt Ihr einige Favoriten, welche würdet Ihr mir empfehlen?




Anmelden zum Antworten