bool CalculateNativeAxis(const float* points, int count, unsigned vertex_size, vec3& r, vec3& s, vec3& t) { // find covariance matrix mat3 c = CreateCovarianceMatrix(points, count, vertex_size); // find eigen values of the covariance matrix Math::vec3 eigen_values; if (!EigenValues(c, eigen_values)) return (out_error() << "Can't find eigen values for matrix " << c.ToString() << std::endl, false); // find eigen vectors of the covariance matrix Math::vec3 eigen_vectors[3]; if (!EigenVectors(c, eigen_values, eigen_vectors)) return (out_error() << "Can't find eigen values for matrix " << c.ToString() << " with eigen values " << eigen_values.ToString() << std::endl, false); r = eigen_vectors[0]; s = eigen_vectors[1]; t = eigen_vectors[2]; mat3 a; a.SetColumn(0, r); a.SetColumn(1, s); a.SetColumn(2, t); out_message() << "Matrix a: " << a.ToString() << std::endl; mat3 tt = a.Transposed() * c * a; out_message() << "Matrix tt: " << tt.ToString() << std::endl; return true; }
// ====================================================================== // FIXME: Add List void Eigs(const Operator& A, int NumEigenvalues, MultiVector& ER, MultiVector& EI) { if (A.GetDomainSpace() != A.GetRangeSpace()) ML_THROW("Input Operator is not square", -1); double time; time = GetClock(); int length = NumEigenvalues; double tol = 1e-3; int restarts = 1; int output = 10; bool PrintStatus = true; // 1.- set parameters for Anasazi Teuchos::ParameterList AnasaziList; // MatVec should be either "A" or "ML^{-1}A" AnasaziList.set("eigen-analysis: matrix operation", "A"); AnasaziList.set("eigen-analysis: use diagonal scaling", false); AnasaziList.set("eigen-analysis: symmetric problem", false); AnasaziList.set("eigen-analysis: length", length); AnasaziList.set("eigen-analysis: block-size",1); AnasaziList.set("eigen-analysis: tolerance", tol); AnasaziList.set("eigen-analysis: restart", restarts); AnasaziList.set("eigen-analysis: output", output); AnasaziList.get("eigen-analysis: print current status",PrintStatus); // data to hold real and imag for eigenvalues and eigenvectors Space ESpace(-1, NumEigenvalues); ER.Reshape(ESpace); EI.Reshape(ESpace); // this is the starting value -- random Epetra_MultiVector EigenVectors(A.GetRowMatrix()->OperatorDomainMap(), NumEigenvalues); EigenVectors.Random(); #ifdef HAVE_ML_ANASAxI //int NumRealEigenvectors, NumImagEigenvectors; #endif AnasaziList.set("eigen-analysis: action", "LM"); #ifdef HAVE_ML_ANASAxI ML_THROW("fixme...", -1); /* FIXME ML_Anasazi::Interface(A.GetRowMatrix(),EigenVectors,ER.GetValues(), EI.GetValues(), AnasaziList, 0, 0, &NumRealEigenvectors, &NumImagEigenvectors, 0); */ #else ML_THROW("Anasazi is no longer supported", -1); #endif return; }
void EigenProblemsTest::testSyev() { std::cout << "--> Test: syev." <<std::endl; // turn A to a symmetric matrix A->randomize_sym(); *Aref = *A; // Initialize EigenVectors with A SP::SiconosVector EigenValues(new SiconosVector(size)); SP::SimpleMatrix EigenVectors(new SimpleMatrix(*A)); // *EigenVectors = *A; Siconos::eigenproblems::syev(*EigenValues, *EigenVectors); DenseVect error(size); error *= 0.0; for( unsigned int i = 0; i < size; ++i ) { error.plus_assign(ublas::prod( *A->dense(), column(*EigenVectors->dense(), i) )); error.minus_assign((*EigenValues->dense())(i)*column(*EigenVectors->dense(),i)); } // Check ... CPPUNIT_ASSERT_EQUAL_MESSAGE("testSyev 1: ", norm_2(error) < 10 * std::numeric_limits< double >::epsilon() , true); // Check if A has not been modified CPPUNIT_ASSERT_EQUAL_MESSAGE("testSyev 2: ", (*A) == (*Aref) , true); // Now compute only eigenvalues SP::SiconosVector RefEigenValues(new SiconosVector(*EigenValues)); *EigenVectors = *A; *EigenValues *= 0.0; Siconos::eigenproblems::syev(*EigenValues, *EigenVectors, false); CPPUNIT_ASSERT_EQUAL_MESSAGE("testSyev 3: ", ((*EigenValues) - (*RefEigenValues)).norm2() < 10 * std::numeric_limits< double >::epsilon(), true); CPPUNIT_ASSERT_EQUAL_MESSAGE("testSyev 4: ", (*A) == (*Aref) , true); std::cout << "--> Syev test ended with success." <<std::endl; }