IT++ Logo
inv.cpp
Go to the documentation of this file.
1
29#ifndef _MSC_VER
30# include <itpp/config.h>
31#else
32# include <itpp/config_msvc.h>
33#endif
34
35#if defined(HAVE_LAPACK)
36# include <itpp/base/algebra/lapack.h>
37#endif
38
40
41
42namespace itpp
43{
44
45#if defined(HAVE_LAPACK)
46
47bool inv(const mat &X, mat &Y)
48{
49 it_assert_debug(X.rows() == X.cols(), "inv: matrix is not square");
50
51 int m = X.rows(), info, lwork;
52 lwork = m; // may be choosen better
53
54 ivec p(m);
55 Y = X;
56 vec work(lwork);
57
58 dgetrf_(&m, &m, Y._data(), &m, p._data(), &info); // LU-factorization
59 if (info != 0)
60 return false;
61
62 dgetri_(&m, Y._data(), &m, p._data(), work._data(), &lwork, &info);
63 return (info == 0);
64}
65
66bool inv(const cmat &X, cmat &Y)
67{
68 it_assert_debug(X.rows() == X.cols(), "inv: matrix is not square");
69
70 int m = X.rows(), info, lwork;
71 lwork = m; // may be choosen better
72
73 ivec p(m);
74 Y = X;
75 cvec work(lwork);
76
77 zgetrf_(&m, &m, Y._data(), &m, p._data(), &info); // LU-factorization
78 if (info != 0)
79 return false;
80
81 zgetri_(&m, Y._data(), &m, p._data(), work._data(), &lwork, &info);
82 return (info == 0);
83}
84
85#else
86
87bool inv(const mat &X, mat &Y)
88{
89 it_error("LAPACK library is needed to use inv() function");
90 return false;
91}
92
93bool inv(const cmat &X, cmat &Y)
94{
95 it_error("LAPACK library is needed to use inv() function");
96 return false;
97}
98
99#endif // HAVE_LAPACK
100
101cmat inv(const cmat &X)
102{
103 cmat Y;
104 inv(X, Y);
105 return Y;
106}
107
108
109mat inv(const mat &X)
110{
111 mat Y;
112 inv(X, Y);
113 return Y;
114}
115
116} // namespace itpp
#define it_error(s)
Abort unconditionally.
Definition itassert.h:126
#define it_assert_debug(t, s)
Abort if t is not true and NDEBUG is not defined.
Definition itassert.h:107
bool inv(const mat &X, mat &Y)
Inverse of real square matrix.
Definition inv.cpp:87
Definitions of matrix inversion routines.
itpp namespace
Definition itmex.h:37

Generated on Tue Aug 17 2021 10:59:15 for IT++ by Doxygen 1.9.8