annotate armadillo-2.4.4/include/armadillo_bits/op_inv_meat.hpp @ 5:79b343f3e4b8

In thi version the problem of letters assigned to each segment has been solved.
author maxzanoni76 <max.zanoni@eecs.qmul.ac.uk>
date Wed, 11 Apr 2012 13:48:13 +0100
parents 8b6102e2a9b0
children
rev   line source
max@0 1 // Copyright (C) 2008-2011 NICTA (www.nicta.com.au)
max@0 2 // Copyright (C) 2008-2011 Conrad Sanderson
max@0 3 //
max@0 4 // This file is part of the Armadillo C++ library.
max@0 5 // It is provided without any warranty of fitness
max@0 6 // for any purpose. You can redistribute this file
max@0 7 // and/or modify it under the terms of the GNU
max@0 8 // Lesser General Public License (LGPL) as published
max@0 9 // by the Free Software Foundation, either version 3
max@0 10 // of the License or (at your option) any later version.
max@0 11 // (see http://www.opensource.org/licenses for more info)
max@0 12
max@0 13
max@0 14 //! \addtogroup op_inv
max@0 15 //! @{
max@0 16
max@0 17
max@0 18 //! immediate inverse of a matrix, storing the result in a dense matrix
max@0 19 template<typename eT>
max@0 20 inline
max@0 21 void
max@0 22 op_inv::apply(Mat<eT>& out, const Mat<eT>& A, const bool slow)
max@0 23 {
max@0 24 arma_extra_debug_sigprint();
max@0 25
max@0 26 // no need to check for aliasing, due to:
max@0 27 // - auxlib::inv() copies A to out before inversion
max@0 28 // - for 2x2 and 3x3 matrices the code is alias safe
max@0 29
max@0 30 bool status = auxlib::inv(out, A, slow);
max@0 31
max@0 32 if(status == false)
max@0 33 {
max@0 34 out.reset();
max@0 35 arma_bad("inv(): matrix appears to be singular");
max@0 36 }
max@0 37 }
max@0 38
max@0 39
max@0 40
max@0 41 //! immediate inverse of T1, storing the result in a dense matrix
max@0 42 template<typename T1>
max@0 43 inline
max@0 44 void
max@0 45 op_inv::apply(Mat<typename T1::elem_type>& out, const Op<T1,op_inv>& X)
max@0 46 {
max@0 47 arma_extra_debug_sigprint();
max@0 48
max@0 49 typedef typename T1::elem_type eT;
max@0 50
max@0 51 const strip_diagmat<T1> strip(X.m);
max@0 52
max@0 53 if(strip.do_diagmat == true)
max@0 54 {
max@0 55 op_inv::apply_diag(out, strip.M);
max@0 56 }
max@0 57 else
max@0 58 {
max@0 59 const uword mode = X.aux_uword_a;
max@0 60
max@0 61 const bool status = (mode == 0) ? auxlib::inv(out, X.m) : auxlib::inv(out, X.m, true);
max@0 62
max@0 63 if(status == false)
max@0 64 {
max@0 65 out.reset();
max@0 66 arma_bad("inv(): matrix appears to be singular");
max@0 67 }
max@0 68 }
max@0 69 }
max@0 70
max@0 71
max@0 72
max@0 73 template<typename T1>
max@0 74 inline
max@0 75 void
max@0 76 op_inv::apply_diag(Mat<typename T1::elem_type>& out, const Base<typename T1::elem_type, T1>& X)
max@0 77 {
max@0 78 arma_extra_debug_sigprint();
max@0 79
max@0 80 typedef typename T1::elem_type eT;
max@0 81
max@0 82 const diagmat_proxy_check<T1> A(X.get_ref(), out);
max@0 83
max@0 84 const uword N = A.n_elem;
max@0 85
max@0 86 out.set_size(N,N);
max@0 87
max@0 88 for(uword col=0; col<N; ++col)
max@0 89 {
max@0 90 for(uword row=0; row<col; ++row) { out.at(row,col) = eT(0); }
max@0 91
max@0 92 out.at(col,col) = eT(1) / A[col];
max@0 93
max@0 94 for(uword row=col+1; row<N; ++row) { out.at(row,col) = eT(0); }
max@0 95 }
max@0 96
max@0 97 }
max@0 98
max@0 99
max@0 100
max@0 101 //! inverse of T1 (triangular matrices)
max@0 102 template<typename T1>
max@0 103 inline
max@0 104 void
max@0 105 op_inv_tr::apply(Mat<typename T1::elem_type>& out, const Op<T1,op_inv_tr>& X)
max@0 106 {
max@0 107 arma_extra_debug_sigprint();
max@0 108
max@0 109 const bool status = auxlib::inv_tr(out, X.m, X.aux_uword_a);
max@0 110
max@0 111 if(status == false)
max@0 112 {
max@0 113 out.reset();
max@0 114 arma_bad("inv(): matrix appears to be singular");
max@0 115 }
max@0 116 }
max@0 117
max@0 118
max@0 119
max@0 120 //! inverse of T1 (symmetric positive definite matrices)
max@0 121 template<typename T1>
max@0 122 inline
max@0 123 void
max@0 124 op_inv_sympd::apply(Mat<typename T1::elem_type>& out, const Op<T1,op_inv_sympd>& X)
max@0 125 {
max@0 126 arma_extra_debug_sigprint();
max@0 127
max@0 128 const bool status = auxlib::inv_sympd(out, X.m, X.aux_uword_a);
max@0 129
max@0 130 if(status == false)
max@0 131 {
max@0 132 out.reset();
max@0 133 arma_bad("inv(): matrix appears to be singular");
max@0 134 }
max@0 135 }
max@0 136
max@0 137
max@0 138
max@0 139 //! @}