Matrixelemente ohne Eintrag, was passiert?



  • Hi,

    was passiert, wenn man alle Einträge einer Matrix abfragt aber nicht jeder Eintrag belegt/gesetzt/definiert wurde?

    Der betreffende Code-Ausschnitt:

    vector<APD> &apdvec_database;
    	(...)
    	const int N = apdvec_database.size();
    	vector<vector<double> > cost (N, vector<double>(N,0));
    	for(size_t i = 0; i<apdvec_database.size(); i++)
    	{
    		double sphere=0.0;
    		for(size_t j = 0; j<apdvec_database.size(); j++)
    		{
    			// Distance
    			Vector4d APD1(apdvec_database[i].getdM(), apdvec_database[i].getUbias(), apdvec_database[i].getdM_irr(), apdvec_database[i].getUbias_irr());
    			Vector4d APD2(apdvec_database[j].getdM(), apdvec_database[j].getUbias(), apdvec_database[j].getdM_irr(), apdvec_database[j].getUbias_irr());
    			Vector4d Difference = APD1 - APD2;
    			RowVector4d DifferenceT = Difference.transpose();
    			sphere = sqrt( DifferenceT * Cov.inverse() * Difference);
    			if(sphere<1)
    			{
    				cost[i][j] = sphere;
    			}
    		}
    	}
    

    Wie man sieht, werden Einträge in der Matrix nur dann gesetzt, wenn sphere<1. Was ist, wenn ich dann anschließend die Einträge abfrage, die diese Bedingung nicht erfüllt haben?

    Das Programm stürzt schonmal nicht ab,.. es liefert an und für sich auch keine widersprüchlichen Ergebnisse aber ich muss wissen, ob ich denen vertrauen kann und nicht irgendwelche komischen Sachen passieren.



  • Mit

    Progressive schrieb:

    vector<vector<double> > cost (N, vector<double>(N,0));
    

    hast Du alle N x N Vectorelemente mit einer Kopie von 0 initialisiert.



  • vector<vector<double> > cost (N, vector<double>(N,0));
    

    Was passiert hier?

    Ein vector von vector ist keine Matrix. Benutze besser einen vector der Größe N*N. Schreibe dir eine Klasse mit passendem operator()(int row, int col).



  • Hi,
    erstmal danke!
    Ich habe gerade gemerkt, dass ich mir die Einträge ja ganz einfach mit cout anzeigen lassen kann (war die letzten Monaten eher c++-abstinent..).

    Danke für den Tipp wegen der Matrix.
    Dennoch, rein zum Verständnis: Kann es Auswirkungen haben, wenn man es auf meine bisherige Art macht?



  • Progressive schrieb:

    Dennoch, rein zum Verständnis: Kann es Auswirkungen haben, wenn man es auf meine bisherige Art macht?

    Es ist langsamer, da 1. mehrere Speicherblöcke statt nur einem verwaltet werden müssen und 2. beim Zugriff zwischen diesen Speicherblöcken gesprungen wird und daher der Prozessorcache weniger gut genutzt werden kann. Je nach Anwendungsfall kann das natürlich unkritisch sein.

    Ein vector von vector bietet mehr Möglichkeiten, sich selbst in den Fuß zu schießen. Ein beliebter Fehler ist es, die inneren Vektoren mit Größe 0 anzulegen. Den hast du schon mal nicht gemacht 👍


Log in to reply