void TestERowMatrix::testEigenValues() { VectorT<float> buffer(3); RowMatrixT<float> b(3,3,0.0f); float data[][3]= {{1.00861, 2.17143, 2.90536}, {9.01223, 2.17129, 1.90898}, {8.01585, 2.17114, 9.9126}, {7.01947, 2.171, 8.91622}, {6.02309, 2.17086, 7.91984}, {5.02671, 2.17071, 6.92346}, {4.03033, 2.17057, 5.92708}, {3.03396, 2.17042, 4.93071}, {2.03758, 2.17028, 3.93433}, {1.0412, 2.17013, 2.93795}}; for(int i=0;i<10;i++) { //buffer = VectorT<float>::UniformRandom(3,1.0,10.0,i); buffer = VectorT<float>(data[i], 3, VectorBase::external); //std::cerr << buffer << std::endl; RowMatrixT<float> x(buffer.getDataPointer(),3,1,MatrixBase::external); RowMatrixT<float> a(3,3); a.multiply(x,x,false,true); b+=a; } RowMatrixT<double> evecs; VectorT<double> evals; RowMatrixT<double> I; #ifdef NICE_USELIB_IPP { float array[]= {11,4,14,4,-1,10,14,10,8}; RowMatrixT<float> c(array,3,3); eigenvalues(c,&buffer); CPPUNIT_ASSERT_DOUBLES_EQUAL_NOT_NAN(0.0,27-buffer(0), 2E-6); CPPUNIT_ASSERT_DOUBLES_EQUAL_NOT_NAN(0.0,buffer(1), 2E-6); CPPUNIT_ASSERT_DOUBLES_EQUAL_NOT_NAN(0.0,-9-buffer(2), 1E-6); } { eigenvalues(b,&buffer); CPPUNIT_ASSERT_DOUBLES_EQUAL_NOT_NAN(677.0, buffer(0), 5); CPPUNIT_ASSERT_DOUBLES_EQUAL_NOT_NAN(40.07, buffer(1), 3); // CPPUNIT_ASSERT_DOUBLES_EQUAL_NOT_NAN(674.32794189453, buffer(0), 1E-4); // CPPUNIT_ASSERT_DOUBLES_EQUAL_NOT_NAN(37.728626251220, buffer(1), 1E-4); double array[]= {292,101,295,104,48,122,295,122,384}; RowMatrixT<double> c(array,3,3); eigenvectorvalues(c,evecs,evals); I.multiply(evecs,evecs.transpose()); CPPUNIT_ASSERT_DOUBLES_EQUAL_NOT_NAN(0.0, 1.0-det(I), 2E-15); } #endif #ifdef NICE_USELIB_LINAL { double array[]= {292,101,295,104,48,122,295,122,384}; RowMatrixT<double> c(array,3,3); evals= VectorT<double>(3,0.0); evecs= RowMatrixT<double>(3,3,0.0); LinAl::MatrixCF<double> lc = c.linal(); LinAl::VectorCC<double> levals = evals.linalCol(); LinAl::MatrixCF<double> levecs = evecs.linal(); eigensym(lc, levals, levecs, 3); // CPPUNIT_ASSERT_DOUBLES_EQUAL_NOT_NAN(674.32794189453, levals(0,0), 1E-4); // CPPUNIT_ASSERT_DOUBLES_EQUAL_NOT_NAN(37.728626251220, levals(1,0), 1E-4); CPPUNIT_ASSERT_DOUBLES_EQUAL_NOT_NAN(677.0, levals(0,0), 5); CPPUNIT_ASSERT_DOUBLES_EQUAL_NOT_NAN(40.07, levals(1,0), 1.1); I.multiply(evecs,evecs.transpose()); double d = LinAl::det(I.linal()); CPPUNIT_ASSERT_DOUBLES_EQUAL_NOT_NAN(0.0, 1.0-d, 1E-15); } #endif }