cholesky.h
上传用户:kellyonhid
上传日期:2013-10-12
资源大小:932k
文件大小:2k
源码类别:

3D图形编程

开发平台:

Visual C++

  1. // Template Numerical Toolkit (TNT) for Linear Algebra
  2. //
  3. // BETA VERSION INCOMPLETE AND SUBJECT TO CHANGE
  4. // Please see http://math.nist.gov/tnt for updates
  5. //
  6. // R. Pozo
  7. // Mathematical and Computational Sciences Division
  8. // National Institute of Standards and Technology
  9. #ifndef CHOLESKY_H
  10. #define CHOLESKY_H
  11. #include <math.h>
  12. // NOTE: this code uses sqrt(), may need to link with -lm
  13. // index method
  14. #if 1
  15. // scalar point method
  16. //
  17. //
  18. // Only upper part of A is used.  Cholesky factor is returned in
  19. // lower part of L.
  20. //
  21. template <class SPDMatrix, class SymmMatrix>
  22. int Cholesky_upper_factorization(SPDMatrix &A, SymmMatrix &L)
  23. {
  24.     Subscript M = A.dim(1);
  25.     Subscript N = A.dim(2);
  26.     assert(M == N);                 // make sure A is square
  27.     // readjust size of L, if necessary
  28.     if (M != L.dim(1) || N != L.dim(2))
  29.         L = SymmMatrix(N,N);
  30.     Subscript i,j,k;
  31.     typename SPDMatrix::element_type dot=0;
  32.     for (j=1; j<=N; j++)                // form column j of L
  33.     {
  34.         dot= 0;
  35.         for (i=1; i<j; i++)             // for k= 1 TO j-1
  36.             dot = dot +  L(j,i)*L(j,i);
  37.         L(j,j) = A(j,j) - dot;
  38.         for (i=j+1; i<=N; i++)
  39.         {
  40.             dot = 0;
  41.             for (k=1; k<j; k++)
  42.                 dot = dot +  L(i,k)*L(j,k);
  43.             L(i,j) = A(j,i) - dot;
  44.         }
  45.         if (L(j,j) <= 0.0) return 1;
  46.         L(j,j) = sqrt( L(j,j) );
  47.         for (i=j+1; i<=N; i++)
  48.             L(i,j) = L(i,j) / L(j,j);
  49.     }
  50.     return 0;
  51. }
  52. #else       /* use vector/matrix index regions */
  53. template <class Matrix, class Vector>
  54. void Cholesky_lower_factorization(Matrix &A, Vector &b)
  55. {
  56.     Subscript m = A.dim(1);
  57.     Subscript n = A.dim(2);
  58.     Subscript i,j;
  59.     Subscript N = (m < n ? n : m);          // K = min(M,N);
  60.     assert( N <= b.dim() );
  61.     for (j=1; j<=N; j++)
  62.     {
  63.         Index J(1, j-1);
  64.         L(j,j) = A(j,j) - dot_product(L(j,J), L(j,J));
  65.         for (i=j+1; j<=N; j++)
  66.             L(i,j) = A(j,i) - dot_product( L(i,J), L(j,J));
  67.         L(j,j) = sqrt( L(j,j) );
  68.         for (i=j+1; j<=N; j++)
  69.             L(i,j) = L(i,j) / L(j,j);
  70.     }
  71. }
  72. #endif
  73. // TNT_USE_REGIONS
  74. #endif
  75. // CHOLESKY_H