Eigen.tcc 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. /*
  2. * NICE-Core - efficient algebra and computer vision methods
  3. * - libbasicvector - A simple vector library
  4. * See file License for license information.
  5. */
  6. #include "core/vector/Eigen.h"
  7. namespace NICE {
  8. template<class T>
  9. VectorT<T> maxEigenVector(const MatrixT<T>& a) {
  10. if (a.rows() != a.cols()) {
  11. fthrow(Exception, "Matrix must be a squarematrix.");
  12. }
  13. VectorT<T> v(a.rows());
  14. v.set(T(1));
  15. v.normalizeL2();
  16. while (true) {
  17. VectorT<T> w(v.size());
  18. w.multiply(a, v);
  19. w.normalizeL2();
  20. VectorT<T> diff(v);
  21. diff -= w;
  22. v = w;
  23. if (diff.normL2() < 10.0 * std::numeric_limits<T>::epsilon()) {
  24. break;
  25. }
  26. }
  27. return v;
  28. }
  29. template<class T>
  30. VectorT<T> *eigenvalues(const MatrixT<T> &A, VectorT<T> *evals)
  31. {
  32. size_t vsize=A.cols();
  33. if(A.rows()!=vsize)
  34. fthrow(Exception,"Matrix must be a squarematrix.");
  35. if(evals==NULL)
  36. evals=new VectorT<T>(vsize);
  37. if(evals->size()!=vsize)
  38. fthrow(Exception,"vectorsize != vsize.");
  39. T buffer[vsize*vsize];
  40. size_t tsize=sizeof(T);
  41. IppStatus ret = ippmEigenValuesSym_m(A.getDataPointer(), vsize*tsize, tsize, buffer, evals->getDataPointer(), vsize);
  42. /* ippStsSingularErr not defined
  43. if(ret==ippStsSingularErr)
  44. return evals;
  45. */
  46. if(ret!=ippStsNoErr)
  47. _THROW_EVector(ippGetStatusString(ret));
  48. return evals;
  49. }
  50. template<class T>
  51. void eigenvectorvalues(const MatrixT<T> &A, MatrixT<T> &evecs, VectorT<T> &evals)
  52. {
  53. size_t vsize=A.cols();
  54. if(A.rows()!=vsize)
  55. fthrow(Exception,"Matrix must be a squarematrix.");
  56. if(evecs.rows() != vsize && evecs.cols() != vsize)
  57. evecs.resize(vsize,vsize);
  58. if(evals.size()!=vsize)
  59. evals.resize(vsize);
  60. T *buffer = new T[vsize*vsize];
  61. size_t tsize=sizeof(T);
  62. IppStatus ret = ippmEigenValuesVectorsSym_m(A.getDataPointer(), vsize*tsize, tsize, buffer,
  63. evecs.getDataPointer(), vsize*tsize, tsize, evals.getDataPointer(), vsize);
  64. evecs.transposeInplace();
  65. delete [] buffer;
  66. if(ret!=ippStsNoErr)
  67. _THROW_EVector(ippGetStatusString(ret));
  68. }
  69. template<class T>
  70. VectorT<T> *eigenvalues(const RowMatrixT<T> &A, VectorT<T> *evals)
  71. {
  72. size_t vsize=A.cols();
  73. if(A.rows()!=vsize)
  74. fthrow(Exception,"Matrix must be a squarematrix.");
  75. if(evals==NULL)
  76. evals=new VectorT<T>(vsize);
  77. if(evals->size()!=vsize)
  78. fthrow(Exception,"vectorsize != vsize.");
  79. T buffer[vsize*vsize];
  80. size_t tsize=sizeof(T);
  81. IppStatus ret = ippmEigenValuesSym_m(A.getDataPointer(), vsize*tsize, tsize, buffer, evals->getDataPointer(), vsize);
  82. /* ippStsSingularErr not defined
  83. if(ret==ippStsSingularErr)
  84. return evals;
  85. */
  86. if(ret!=ippStsNoErr)
  87. _THROW_EVector(ippGetStatusString(ret));
  88. return evals;
  89. }
  90. template<class T>
  91. void eigenvectorvalues(const RowMatrixT<T> &A, RowMatrixT<T> &evecs, VectorT<T> &evals)
  92. {
  93. size_t vsize=A.cols();
  94. if(A.rows()!=vsize)
  95. fthrow(Exception,"Matrix must be a squarematrix.");
  96. if(evecs.rows() != vsize && evecs.cols() != vsize)
  97. evecs.resize(vsize,vsize);
  98. if(evals.size()!=vsize)
  99. evals.resize(vsize);
  100. T buffer[vsize*vsize];
  101. size_t tsize=sizeof(T);
  102. IppStatus ret = ippmEigenValuesVectorsSym_m(A.getDataPointer(), vsize*tsize, tsize, buffer,
  103. evecs.getDataPointer(), vsize*tsize, tsize, evals.getDataPointer(), vsize);
  104. if(ret!=ippStsNoErr)
  105. _THROW_EVector(ippGetStatusString(ret));
  106. }
  107. }