nan nicht nachvollziehbar



  • Hi,

    ich habe folgende Daten:

    Serial_number	Bias_voltage	Slope	Bias_voltage_irr	Slope_irr
    1205013067	376.498943729227	2.75082585760394	376.688899264061	2.75084113940164
    1205013069	373.287817831307	2.75074375125675	373.392663499518	2.75092754974534
    1205013070	377.091938091279	2.75082292557743	377.466035993347	2.75077191984784
    1205013071	374.799551607287	2.75094834987157	374.209110037364	2.75091796001419
    

    Jede Zeile steht für ein Bauteil mit den entsprechenden vier Parametern pro Zeile. Die Bauteile existieren als eine separate Klasse namens APD und jedes Bauteil ist ein Objekt dieser.
    In einer bestimmten Phase meines Programms:

    vector<vector<double> > cost (N, vector<double>(N,0));
    		MatrixXd Population(N, 4);
    		for(size_t i = 0; i<apdvec_database.size(); i++)
    		{
    			// 0 = slope, 1 = Ubias, 2 = slope_irr, 3 = Ubias_irr
    			Population(i, 0) = apdvec_database[i].getdM();
    			Population(i, 1) = apdvec_database[i].getUbias();
    			Population(i, 2) = apdvec_database[i].getdM_irr();
    			Population(i, 3) = apdvec_database[i].getUbias_irr();
    		}
    		MatrixXd Centered = Population.rowwise() - Population.colwise().mean();
    		MatrixXd Cov = (Centered.adjoint() * Centered) / double(Population.rows() - 1);
    	for(size_t i = 0; i<apdvec_database.size(); i++)
    	{
    		double sphere=0.0;
    		for(size_t j = 0; j<apdvec_database.size(); j++)
    		{
    			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);
    			{
    				cost[i][j] = sphere;
    			}
    
    			if(apdvec_database[i].getSN()==1205013069 && apdvec_database[j].getSN()==1205013067){
    				 cout << "APD1: " << apdvec_database[i].getSN() << endl << APD1 << endl;
    				 cout << "APD2: " << apdvec_database[j].getSN() << endl << APD2 << endl;
    				 cout << "\t Difference transp: " << DifferenceT << endl;
    				 cout << "\t Inverse covariance: " << Cov.inverse() << endl;
    				 cout << "\t Inverse covariance: " << Difference << endl;
    				 cout << "\t distance: " << cost[i][j] << " between APD " <<  apdvec_database[i].getSN() << " and " << apdvec_database[j].getSN() << endl;
    			}
    		}
    	}
    

    passiert es, dass bei den Bauteilen 1205013069 und 1205013071 ein "nan" für cost[i][j]=sphere produziert wird.
    Woran liegt das, worum geht es hier überhaupt? Ich habe gelesen, dass ein nan dann erzeugt wird, wenn die Operation mathematisch nicht definiert ist. Aber das ist sie doch..?
    Vielen Dank schonmal!



  • Es gibt noch ein Grund für NaN: Nicht representierbare floating point Werte.

    Schau dir mal die Zwischenergebnisse für den NaN Fall an.



  • Schlangenmensch schrieb:

    Es gibt noch ein Grund für NaN: Nicht representierbare floating point Werte.

    Schau dir mal die Zwischenergebnisse für den NaN Fall an.

    Mh, es taucht in

    sphere = sqrt( DifferenceT * Cov.inverse() * Difference);
    

    zum ersten Mal auf.

    Muss ein anderer Datentyp her?

    Daten:

    APD1: 1205013069
    2.75074
    373.288
    2.75093
    373.393
    APD2: 1205013071
    2.75095
      374.8
    2.75092
    374.209
    
    Difference transp: 
    -0.000204599     -1.51173  9.58973e-06    -0.816447
    
    Inverse covariance:  
     3.24779e+22 -8.58499e+18  1.40166e+22  7.92177e+18
    -8.58499e+18   2.2693e+15 -3.70505e+18 -2.09399e+15
     1.40166e+22 -3.70505e+18  6.04917e+21  3.41882e+18
     7.92177e+18 -2.09399e+15  3.41882e+18  1.93222e+15
    
    Difference: 
     -0.000204599
        -1.51173
     9.58973e-06
       -0.816447
    


  • sqrt von negativen Zahlen ergibt idR. nan.



  • Wenn ich Octave frage, was das Ergebnis von deinem Ausdruck ist, bekomme ich eine Matrix mit imaginären Einträgen
    http://tpcg.io/FGopVo

    Das ist so wahrscheinlich nicht gewollt und kann von einem double natürlich nicht dargestellt werden


Anmelden zum Antworten