inv.cpp
Go to the documentation of this file.
#ifndef _MSC_VER
# include <itpp/config.h>
#else
# include <itpp/config_msvc.h>
#endif
#if defined(HAVE_LAPACK)
# include <itpp/base/algebra/lapack.h>
#endif
#include <itpp/base/algebra/inv.h>
namespace itpp
{
#if defined(HAVE_LAPACK)
bool inv(const mat &X, mat &Y)
{
it_assert_debug(X.rows() == X.cols(), "inv: matrix is not square");
int m = X.rows(), info, lwork;
lwork = m; // may be choosen better
ivec p(m);
Y = X;
vec work(lwork);
dgetrf_(&m, &m, Y._data(), &m, p._data(), &info); // LU-factorization
if (info != 0)
return false;
dgetri_(&m, Y._data(), &m, p._data(), work._data(), &lwork, &info);
return (info == 0);
}
bool inv(const cmat &X, cmat &Y)
{
it_assert_debug(X.rows() == X.cols(), "inv: matrix is not square");
int m = X.rows(), info, lwork;
lwork = m; // may be choosen better
ivec p(m);
Y = X;
cvec work(lwork);
zgetrf_(&m, &m, Y._data(), &m, p._data(), &info); // LU-factorization
if (info != 0)
return false;
zgetri_(&m, Y._data(), &m, p._data(), work._data(), &lwork, &info);
return (info == 0);
}
#else
bool inv(const mat &X, mat &Y)
{
it_error("LAPACK library is needed to use inv() function");
return false;
}
bool inv(const cmat &X, cmat &Y)
{
it_error("LAPACK library is needed to use inv() function");
return false;
}
#endif // HAVE_LAPACK
cmat inv(const cmat &X)
{
cmat Y;
inv(X, Y);
return Y;
}
mat inv(const mat &X)
{
mat Y;
inv(X, Y);
return Y;
}
} // namespace itpp
it_error
#define it_error(s)
Abort unconditionally.
Definition itassert.h:126
it_assert_debug
#define it_assert_debug(t, s)
Abort if t is not true and NDEBUG is not defined.
Definition itassert.h:107
itpp::inv
bool inv(const mat &X, mat &Y)
Inverse of real square matrix.
Definition inv.cpp:87
inv.h
Definitions of matrix inversion routines.
itpp
itpp namespace
Definition itmex.h:37

Generated on Mon Jun 10 2024 11:49:16 for IT++ by Doxygen 1.9.8