IT++ Logo

inv.cpp

Go to the documentation of this file.
00001 
00030 #ifndef _MSC_VER
00031 #  include <itpp/config.h>
00032 #else
00033 #  include <itpp/config_msvc.h>
00034 #endif
00035 
00036 #if defined(HAVE_LAPACK)
00037 #  include <itpp/base/algebra/lapack.h>
00038 #endif
00039 
00040 #include <itpp/base/algebra/inv.h>
00041 
00042 
00043 namespace itpp {
00044 
00045 #if defined(HAVE_LAPACK)
00046 
00047   bool inv(const mat &X, mat &Y)
00048   {
00049     it_assert_debug(X.rows() == X.cols(), "inv: matrix is not square");
00050 
00051     int m = X.rows(), info, lwork;
00052     lwork = m; // may be choosen better
00053 
00054     ivec p(m);
00055     Y = X;
00056     vec work(lwork);
00057 
00058     dgetrf_(&m, &m, Y._data(), &m, p._data(), &info); // LU-factorization
00059     if (info!=0)
00060       return false;
00061 
00062     dgetri_(&m, Y._data(), &m, p._data(), work._data(), &lwork, &info);
00063     return (info==0);
00064   }
00065 
00066   bool inv(const cmat &X, cmat &Y)
00067   {
00068     it_assert_debug(X.rows() == X.cols(), "inv: matrix is not square");
00069 
00070     int m = X.rows(), info, lwork;
00071     lwork = m; // may be choosen better
00072 
00073     ivec p(m);
00074     Y = X;
00075     cvec work(lwork);
00076 
00077     zgetrf_(&m, &m, Y._data(), &m, p._data(), &info); // LU-factorization
00078     if (info!=0)
00079       return false;
00080 
00081     zgetri_(&m, Y._data(), &m, p._data(), work._data(), &lwork, &info);
00082     return (info==0);
00083   }
00084 
00085 #else
00086 
00087   bool inv(const mat &X, mat &Y)
00088   {
00089     it_error("LAPACK library is needed to use inv() function");
00090     return false;
00091   }
00092 
00093   bool inv(const cmat &X, cmat &Y)
00094   {
00095     it_error("LAPACK library is needed to use inv() function");
00096     return false;
00097   }
00098 
00099 #endif // HAVE_LAPACK
00100 
00101   cmat inv(const cmat &X)
00102   {
00103     cmat Y;
00104     inv(X, Y);
00105     return Y;
00106   }
00107 
00108 
00109   mat inv(const mat &X)
00110   {
00111     mat Y;
00112     inv(X, Y);
00113     return Y;
00114   }
00115 
00116 } // namespace itpp
SourceForge Logo

Generated on Sat Apr 19 10:41:54 2008 for IT++ by Doxygen 1.5.5