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/FGopVoDas ist so wahrscheinlich nicht gewollt und kann von einem double natürlich nicht dargestellt werden