max@0
|
1 // Copyright (C) 2009-2011 NICTA (www.nicta.com.au)
|
max@0
|
2 // Copyright (C) 2009-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 fn_solve
|
max@0
|
15 //! @{
|
max@0
|
16
|
max@0
|
17
|
max@0
|
18
|
max@0
|
19 //! Solve a system of linear equations, i.e., A*X = B, where X is unknown.
|
max@0
|
20 //! For a square matrix A, this function is conceptually the same as X = inv(A)*B,
|
max@0
|
21 //! but is done more efficiently.
|
max@0
|
22 //! The number of rows in A and B must be the same.
|
max@0
|
23 //! B can be either a column vector or a matrix.
|
max@0
|
24 //! This function will also try to provide approximate solutions
|
max@0
|
25 //! to under-determined as well as over-determined systems (non-square A matrices).
|
max@0
|
26
|
max@0
|
27 template<typename T1, typename T2>
|
max@0
|
28 inline
|
max@0
|
29 const Glue<T1, T2, glue_solve>
|
max@0
|
30 solve
|
max@0
|
31 (
|
max@0
|
32 const Base<typename T1::elem_type,T1>& A,
|
max@0
|
33 const Base<typename T1::elem_type,T2>& B,
|
max@0
|
34 const bool slow = false,
|
max@0
|
35 const typename arma_blas_type_only<typename T1::elem_type>::result* junk = 0
|
max@0
|
36 )
|
max@0
|
37 {
|
max@0
|
38 arma_extra_debug_sigprint();
|
max@0
|
39 arma_ignore(junk);
|
max@0
|
40
|
max@0
|
41 return Glue<T1, T2, glue_solve>(A.get_ref(), B.get_ref(), ((slow == false) ? 0 : 1) );
|
max@0
|
42 }
|
max@0
|
43
|
max@0
|
44
|
max@0
|
45
|
max@0
|
46 template<typename T1, typename T2>
|
max@0
|
47 inline
|
max@0
|
48 const Glue<T1, T2, glue_solve_tr>
|
max@0
|
49 solve
|
max@0
|
50 (
|
max@0
|
51 const Op<T1, op_trimat>& A,
|
max@0
|
52 const Base<typename T1::elem_type,T2>& B,
|
max@0
|
53 const bool slow = false,
|
max@0
|
54 const typename arma_blas_type_only<typename T1::elem_type>::result* junk = 0
|
max@0
|
55 )
|
max@0
|
56 {
|
max@0
|
57 arma_extra_debug_sigprint();
|
max@0
|
58 arma_ignore(slow);
|
max@0
|
59 arma_ignore(junk);
|
max@0
|
60
|
max@0
|
61 return Glue<T1, T2, glue_solve_tr>(A.m, B.get_ref(), A.aux_uword_a);
|
max@0
|
62 }
|
max@0
|
63
|
max@0
|
64
|
max@0
|
65
|
max@0
|
66 template<typename T1, typename T2>
|
max@0
|
67 inline
|
max@0
|
68 bool
|
max@0
|
69 solve
|
max@0
|
70 (
|
max@0
|
71 Mat<typename T1::elem_type>& out,
|
max@0
|
72 const Base<typename T1::elem_type,T1>& A,
|
max@0
|
73 const Base<typename T1::elem_type,T2>& B,
|
max@0
|
74 const bool slow = false,
|
max@0
|
75 const typename arma_blas_type_only<typename T1::elem_type>::result* junk = 0
|
max@0
|
76 )
|
max@0
|
77 {
|
max@0
|
78 arma_extra_debug_sigprint();
|
max@0
|
79 arma_ignore(junk);
|
max@0
|
80
|
max@0
|
81 try
|
max@0
|
82 {
|
max@0
|
83 out = solve( A.get_ref(), B.get_ref(), slow );
|
max@0
|
84 }
|
max@0
|
85 catch(std::runtime_error&)
|
max@0
|
86 {
|
max@0
|
87 return false;
|
max@0
|
88 }
|
max@0
|
89
|
max@0
|
90 return true;
|
max@0
|
91 }
|
max@0
|
92
|
max@0
|
93
|
max@0
|
94
|
max@0
|
95 //! @}
|