68 template <
unsigned int idim,
unsigned int n =
idim>
74 template <
class MatrixRep>
75 static bool Dinv(MatrixRep& rhs) {
79 unsigned int work[n+1] = {0};
81 typename MatrixRep::value_type det(0.0);
83 if (DfactMatrix(rhs,det,work) != 0) {
84 Error(
"Inverter::Dinv",
"Dfact_matrix failed!!");
88 int ifail = DfinvMatrix(rhs,work);
89 if (ifail == 0)
return true;
98 static bool Dinv(MatRepSym<T,idim> & rhs) {
100 InvertBunchKaufman(rhs,ifail);
101 if (ifail == 0)
return true;
111 static int DfactMatrix(MatRepStd<T,idim,n> & rhs, T & det,
unsigned int * work);
117 static int DfinvMatrix(MatRepStd<T,idim,n> & rhs,
unsigned int * work);
123 static void InvertBunchKaufman(MatRepSym<T,idim> & rhs,
int &ifail);
143 template <
unsigned int idim,
unsigned int n =
idim>
147 template <
class MatrixRep>
148 static bool Dinv(MatrixRep& rhs) {
149 return Inverter<idim,n>::Dinv(rhs);
152 static bool Dinv(MatRepSym<T,idim> & rhs) {
153 return Inverter<idim,n>::Dinv(rhs);
170 template <
class MatrixRep>
171 inline static bool Dinv(MatrixRep&) {
return true; }
187 template <
class MatrixRep>
188 static bool Dinv(MatrixRep& rhs) {
193 rhs[0] = 1. / rhs[0];
212 template <
class MatrixRep>
213 static bool Dinv(MatrixRep& rhs) {
215 typedef typename MatrixRep::value_type T;
216 T det = rhs[0] * rhs[3] - rhs[2] * rhs[1];
218 if (det == T(0.) ) {
return false; }
225 rhs[2] = -s * rhs[2];
226 rhs[1] = -s * rhs[1];
236 static bool Dinv(MatRepSym<T,2> & rep) {
238 T * rhs = rep.Array();
240 T det = rhs[0] * rhs[2] - rhs[1] * rhs[1];
243 if (det == T(0.)) {
return false; }
248 rhs[1] = -s * rhs[1];
266 class FastInverter<3> {
270 template <
class MatrixRep>
271 static bool Dinv(MatrixRep& rhs);
274 static bool Dinv(MatRepSym<T,3> & rhs);
282 class FastInverter<4> {
285 template <
class MatrixRep>
286 static bool Dinv(MatrixRep& rhs);
289 static bool Dinv(MatRepSym<T,4> & rhs);
297 class FastInverter<5> {
300 template <
class MatrixRep>
301 static bool Dinv(MatrixRep& rhs);
304 static bool Dinv(MatRepSym<T,5> & rhs);
312 template <
unsigned int idim>
316 template <
class MatrixRep>
317 static bool Dinv(MatrixRep&) {
318 STATIC_CHECK(
false, Error_cholesky_SMatrix_type_is_not_symmetric );
322 inline static bool Dinv(MatRepSym<T,idim> & rhs) {
323 CholeskyDecomp<T, idim> decomp(rhs);
324 return decomp.Invert(rhs);