Prev Next cholesky.cpp Headings

Cholesky Factor a Matrix Source Code
 
# include <cassert>
# include <mat2cpp.hpp>
# include <config.h>

# define C2DPOTRF_F77 F77_FUNC_(c2dpotrf, C2DPOTRF)

namespace mat2cpp {
     // Linkage for Fortran version of the Lapack routine dpotrf
     extern "C" fortran_subroutine C2DPOTRF_F77(
          fortran_integer   *c_uplo, 
          fortran_integer   *n, 
          fortran_double    *a, 
          fortran_integer   *lda, 
          fortran_integer   *info
     );
     matrix<double> cholesky
     (const matrix<double> &x, size_t &rank)
     {    assert( x.size1() == x.size2() );
          size_t i, j;

          size_t m = x.size1(); 
          fortran_integer c_uplo = fortran_integer('U'); 
          fortran_double  *a     = new fortran_double  [m * m];
          for(i = 0; i < m; i++)
          {    for(j = 0; j < m; j++)
                    a[ i + j * m ] = x(i, j);
          }
          fortran_integer lda  = fortran_integer(m);
          fortran_integer fm   = fortran_integer(m);
          fortran_integer info;
          C2DPOTRF_F77 (&c_uplo, &fm, a, &lda, &info);
     
          assert( info >= 0 );
          if( info == 0 )
               rank = m;
          else rank = size_t(info - 1);
     
          matrix<double> z(m, m);
          for(i = 0; i < m; i++)
          {    for(j = i; j < m; j++)
                    z(i, j) = a[ i + j * m ];
               for(j = 0; j < i; j++)
                    z(i, j) = 0.;
          }
          delete [] a;
          return z;
     }

}

Input File: lib/cholesky.cpp