/* * NICE-Core - efficient algebra and computer vision methods * - libbasicvector - A simple vector library * See file License for license information. */ #include "core/vector/Eigen.h" namespace NICE { template VectorT maxEigenVector(const MatrixT& a) { if (a.rows() != a.cols()) { fthrow(Exception, "Matrix must be a squarematrix."); } VectorT v(a.rows()); v.set(T(1)); v.normalizeL2(); while (true) { VectorT w(v.size()); w.multiply(a, v); w.normalizeL2(); VectorT diff(v); diff -= w; v = w; if (diff.normL2() < 10.0 * std::numeric_limits::epsilon()) { break; } } return v; } template VectorT *eigenvalues(const MatrixT &A, VectorT *evals) { size_t vsize=A.cols(); if(A.rows()!=vsize) fthrow(Exception,"Matrix must be a squarematrix."); if(evals==NULL) evals=new VectorT(vsize); if(evals->size()!=vsize) fthrow(Exception,"vectorsize != vsize."); T buffer[vsize*vsize]; size_t tsize=sizeof(T); IppStatus ret = ippmEigenValuesSym_m(A.getDataPointer(), vsize*tsize, tsize, buffer, evals->getDataPointer(), vsize); /* ippStsSingularErr not defined if(ret==ippStsSingularErr) return evals; */ if(ret!=ippStsNoErr) _THROW_EVector(ippGetStatusString(ret)); return evals; } template void eigenvectorvalues(const MatrixT &A, MatrixT &evecs, VectorT &evals) { size_t vsize=A.cols(); if(A.rows()!=vsize) fthrow(Exception,"Matrix must be a squarematrix."); if(evecs.rows() != vsize && evecs.cols() != vsize) evecs.resize(vsize,vsize); if(evals.size()!=vsize) evals.resize(vsize); T *buffer = new T[vsize*vsize]; size_t tsize=sizeof(T); IppStatus ret = ippmEigenValuesVectorsSym_m(A.getDataPointer(), vsize*tsize, tsize, buffer, evecs.getDataPointer(), vsize*tsize, tsize, evals.getDataPointer(), vsize); evecs.transposeInplace(); delete [] buffer; if(ret!=ippStsNoErr) _THROW_EVector(ippGetStatusString(ret)); } template VectorT *eigenvalues(const RowMatrixT &A, VectorT *evals) { size_t vsize=A.cols(); if(A.rows()!=vsize) fthrow(Exception,"Matrix must be a squarematrix."); if(evals==NULL) evals=new VectorT(vsize); if(evals->size()!=vsize) fthrow(Exception,"vectorsize != vsize."); T buffer[vsize*vsize]; size_t tsize=sizeof(T); IppStatus ret = ippmEigenValuesSym_m(A.getDataPointer(), vsize*tsize, tsize, buffer, evals->getDataPointer(), vsize); /* ippStsSingularErr not defined if(ret==ippStsSingularErr) return evals; */ if(ret!=ippStsNoErr) _THROW_EVector(ippGetStatusString(ret)); return evals; } template void eigenvectorvalues(const RowMatrixT &A, RowMatrixT &evecs, VectorT &evals) { size_t vsize=A.cols(); if(A.rows()!=vsize) fthrow(Exception,"Matrix must be a squarematrix."); if(evecs.rows() != vsize && evecs.cols() != vsize) evecs.resize(vsize,vsize); if(evals.size()!=vsize) evals.resize(vsize); T buffer[vsize*vsize]; size_t tsize=sizeof(T); IppStatus ret = ippmEigenValuesVectorsSym_m(A.getDataPointer(), vsize*tsize, tsize, buffer, evecs.getDataPointer(), vsize*tsize, tsize, evals.getDataPointer(), vsize); if(ret!=ippStsNoErr) _THROW_EVector(ippGetStatusString(ret)); } }