EigValues.cpp 2.2 KB

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