Exemple #1
0
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
}