EigValues.cpp 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. /**
  2. * @file EigValues.cpp
  3. * @brief EigValues Class
  4. * @author Michael Koch
  5. * @date 08/19/2008
  6. */
  7. #ifdef NOVISUAL
  8. #include <vislearning/nice_nonvis.h>
  9. #else
  10. #include <vislearning/nice.h>
  11. #endif
  12. #include <iostream>
  13. #include "EigValues.h"
  14. using namespace OBJREC;
  15. #define DEBUG_ARNOLDI
  16. // #undef DEBUG_ARNOLDI
  17. using namespace std;
  18. // refactor-nice.pl: check this substitution
  19. // old: using namespace ice;
  20. using namespace NICE;
  21. void EVArnoldi::getEigenvalues(const GenericMatrix &data,Vector &eigenvalues,Matrix &eigenvectors,uint k)
  22. {
  23. if(data.rows()!=data.cols())
  24. {
  25. throw("EVArnoldi: matrix has to be quadratic");
  26. }
  27. if(k<=0)
  28. {
  29. throw("EVArnoldi: please use k>0.");
  30. }
  31. #ifdef DEBUG_ARNOLDI
  32. fprintf(stderr,"Initialize Matrices\n");
  33. #endif
  34. uint n=data.cols();
  35. NICE::Matrix rmatrix=Matrix(n,k,0);//=eigenvectors
  36. NICE::Matrix qmatrix=Matrix(n,k,0);//saves data =eigenvectors
  37. eigenvalues.resize(k);
  38. NICE::Vector q=Vector(n);
  39. NICE::Vector r=Vector(n);
  40. #ifdef DEBUG_ARNOLDI
  41. fprintf(stderr,"Random Initialization\n");
  42. #endif
  43. //random initialisation
  44. for(uint i=0;i<k;i++)
  45. for(uint j=0;j<n;j++)
  46. rmatrix(j, i)=drand48();
  47. //reduceddim
  48. double delta=1.0;
  49. uint iteration=0;
  50. while (delta>mindelta &&iteration<maxiterations)
  51. {
  52. NICE::Vector rold (rmatrix.getColumn(k-1));
  53. for(uint reduceddim=0;reduceddim<k;reduceddim++)
  54. {
  55. //get Vector r_k of Matrix
  56. q=rmatrix.getColumn(reduceddim);
  57. q.normalizeL2();
  58. // q=r_k/||r_k||
  59. qmatrix.getColumnRef(reduceddim) = q;
  60. Vector currentCol = rmatrix.getColumnRef(reduceddim); // FIXME
  61. data.multiply(currentCol,q); //r_{k+1}=A*q
  62. for(uint j=0;j<reduceddim;j++)
  63. rmatrix.getColumnRef(reduceddim) -= qmatrix.getColumn(j)*(qmatrix.getColumn(j).scalarProduct(rmatrix.getColumn(reduceddim)));
  64. }
  65. //convergence stuff
  66. NICE::Vector diff=rold-rmatrix.getColumn(k-1);
  67. delta=diff.normL2();
  68. iteration++;
  69. #ifdef DEBUG_ARNOLDI
  70. fprintf (stderr, "EVArnoldi: [%d] delta=%f\n", iteration, delta );
  71. #endif
  72. }
  73. eigenvectors=rmatrix;
  74. for(uint i=0;i<k;i++)
  75. {
  76. NICE::Vector tmp;
  77. eigenvectors.getColumnRef(i).normalizeL2();
  78. data.multiply(tmp,eigenvectors.getColumn(i));
  79. eigenvalues[i]=tmp.scalarProduct( eigenvectors.getColumn(i) );
  80. }
  81. }