Prev Next matrix_div.cpp Headings

Matrix Division Source Code
 
# include <cassert>
# include <mat2cpp.hpp>
# include <config.h>

# define DGESV_F77 F77_FUNC_(dgesv, DGESV)

namespace mat2cpp {
     // Linkage for Fortran version of the Lapack routine dgesv
     extern "C" fortran_subroutine DGESV_F77(
          fortran_integer   *n, 
          fortran_integer   *nrhs, 
          fortran_double    *a, 
          fortran_integer   *lda, 
          fortran_integer   *ipv, 
          fortran_double    *b, 
          fortran_integer   *ldb, 
          fortran_integer   *info
     );
     matrix<double> matrix_div
     (const matrix<double> &x, const matrix<double> &y, size_t &rank)
     {    assert( x.size1() == x.size2() );
          assert( x.size2() == y.size1() );
     
          size_t i, j;
          size_t m               = y.size1();
          size_t n               = y.size2();
          fortran_double  *a     = new fortran_double  [m * m];
          fortran_double  *b     = new fortran_double  [m * n];
          fortran_integer *ipv   = new fortran_integer [m];
          for(i = 0; i < m; i++)
          {    for(j = 0; j < m; j++)
                    a[ i + j * m ] = x(i, j);
               for(j = 0; j < n; j++)
                    b[ i + j * m ] = y(i, j);
          }
          fortran_integer lda  = fortran_integer(m);
          fortran_integer ldb  = fortran_integer(m);
          fortran_integer fm   = fortran_integer(m);
          fortran_integer fn   = fortran_integer(n);
          fortran_integer info;
          DGESV_F77(&fm, &fn, a, &lda, ipv, b, &ldb, &info);
     
          assert( info >= 0 );
          if( info == 0 )
               rank = m;
          else rank = size_t(info - 1);
     
          matrix<double> z(m, n);
          for(i = 0; i < m; i++)
          {    for(j = 0; j < n; j++)
                    z(i, j) = b[ i + j * m ];
          }
          delete [] ipv;
          delete [] b;
          delete [] a;
          return z;
     }

}

Input File: lib/matrix_div.cpp