Chris@49: // Copyright (C) 2008-2011 NICTA (www.nicta.com.au) Chris@49: // Copyright (C) 2008-2011 Conrad Sanderson Chris@49: // Chris@49: // This Source Code Form is subject to the terms of the Mozilla Public Chris@49: // License, v. 2.0. If a copy of the MPL was not distributed with this Chris@49: // file, You can obtain one at http://mozilla.org/MPL/2.0/. Chris@49: Chris@49: Chris@49: //! \addtogroup op_inv Chris@49: //! @{ Chris@49: Chris@49: Chris@49: //! immediate inverse of a matrix, storing the result in a dense matrix Chris@49: template Chris@49: inline Chris@49: void Chris@49: op_inv::apply(Mat& out, const Mat& A, const bool slow) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: // no need to check for aliasing, due to: Chris@49: // - auxlib::inv() copies A to out before inversion Chris@49: // - for 2x2 and 3x3 matrices the code is alias safe Chris@49: Chris@49: bool status = auxlib::inv(out, A, slow); Chris@49: Chris@49: if(status == false) Chris@49: { Chris@49: out.reset(); Chris@49: arma_bad("inv(): matrix appears to be singular"); Chris@49: } Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: //! immediate inverse of T1, storing the result in a dense matrix Chris@49: template Chris@49: inline Chris@49: void Chris@49: op_inv::apply(Mat& out, const Op& X) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: const strip_diagmat strip(X.m); Chris@49: Chris@49: if(strip.do_diagmat == true) Chris@49: { Chris@49: op_inv::apply_diag(out, strip.M); Chris@49: } Chris@49: else Chris@49: { Chris@49: const uword mode = X.aux_uword_a; Chris@49: Chris@49: const bool status = (mode == 0) ? auxlib::inv(out, X.m) : auxlib::inv(out, X.m, true); Chris@49: Chris@49: if(status == false) Chris@49: { Chris@49: out.reset(); Chris@49: arma_bad("inv(): matrix appears to be singular"); Chris@49: } Chris@49: } Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: void Chris@49: op_inv::apply_diag(Mat& out, const Base& X) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: typedef typename T1::elem_type eT; Chris@49: Chris@49: const diagmat_proxy_check A(X.get_ref(), out); Chris@49: Chris@49: const uword N = A.n_elem; Chris@49: Chris@49: out.set_size(N,N); Chris@49: Chris@49: for(uword col=0; col Chris@49: inline Chris@49: void Chris@49: op_inv_tr::apply(Mat& out, const Op& X) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: const bool status = auxlib::inv_tr(out, X.m, X.aux_uword_a); Chris@49: Chris@49: if(status == false) Chris@49: { Chris@49: out.reset(); Chris@49: arma_bad("inv(): matrix appears to be singular"); Chris@49: } Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: //! inverse of T1 (symmetric positive definite matrices) Chris@49: template Chris@49: inline Chris@49: void Chris@49: op_inv_sympd::apply(Mat& out, const Op& X) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: const bool status = auxlib::inv_sympd(out, X.m, X.aux_uword_a); Chris@49: Chris@49: if(status == false) Chris@49: { Chris@49: out.reset(); Chris@49: arma_bad("inv(): matrix appears to be singular"); Chris@49: } Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: //! @}