Mercurial > hg > segmenter-vamp-plugin
diff armadillo-3.900.4/include/armadillo_bits/fn_solve.hpp @ 49:1ec0e2823891
Switch to using subrepo copies of qm-dsp, nnls-chroma, vamp-plugin-sdk; update Armadillo version; assume build without external BLAS/LAPACK
author | Chris Cannam |
---|---|
date | Thu, 13 Jun 2013 10:25:24 +0100 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/armadillo-3.900.4/include/armadillo_bits/fn_solve.hpp Thu Jun 13 10:25:24 2013 +0100 @@ -0,0 +1,90 @@ +// Copyright (C) 2009-2011 NICTA (www.nicta.com.au) +// Copyright (C) 2009-2011 Conrad Sanderson +// +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + + +//! \addtogroup fn_solve +//! @{ + + + +//! Solve a system of linear equations, i.e., A*X = B, where X is unknown. +//! For a square matrix A, this function is conceptually the same as X = inv(A)*B, +//! but is done more efficiently. +//! The number of rows in A and B must be the same. +//! B can be either a column vector or a matrix. +//! This function will also try to provide approximate solutions +//! to under-determined as well as over-determined systems (non-square A matrices). + +template<typename T1, typename T2> +inline +const Glue<T1, T2, glue_solve> +solve + ( + const Base<typename T1::elem_type,T1>& A, + const Base<typename T1::elem_type,T2>& B, + const bool slow = false, + const typename arma_blas_type_only<typename T1::elem_type>::result* junk = 0 + ) + { + arma_extra_debug_sigprint(); + arma_ignore(junk); + + return Glue<T1, T2, glue_solve>(A.get_ref(), B.get_ref(), ((slow == false) ? 0 : 1) ); + } + + + +template<typename T1, typename T2> +inline +const Glue<T1, T2, glue_solve_tr> +solve + ( + const Op<T1, op_trimat>& A, + const Base<typename T1::elem_type,T2>& B, + const bool slow = false, + const typename arma_blas_type_only<typename T1::elem_type>::result* junk = 0 + ) + { + arma_extra_debug_sigprint(); + arma_ignore(slow); + arma_ignore(junk); + + return Glue<T1, T2, glue_solve_tr>(A.m, B.get_ref(), A.aux_uword_a); + } + + + +template<typename T1, typename T2> +inline +bool +solve + ( + Mat<typename T1::elem_type>& out, + const Base<typename T1::elem_type,T1>& A, + const Base<typename T1::elem_type,T2>& B, + const bool slow = false, + const typename arma_blas_type_only<typename T1::elem_type>::result* junk = 0 + ) + { + arma_extra_debug_sigprint(); + arma_ignore(junk); + + try + { + out = solve( A.get_ref(), B.get_ref(), slow ); + } + catch(std::runtime_error&) + { + return false; + } + + return true; + } + + + +//! @}