Chris@49
|
1 // Copyright (C) 2009-2012 NICTA (www.nicta.com.au)
|
Chris@49
|
2 // Copyright (C) 2009-2012 Conrad Sanderson
|
Chris@49
|
3 //
|
Chris@49
|
4 // This Source Code Form is subject to the terms of the Mozilla Public
|
Chris@49
|
5 // License, v. 2.0. If a copy of the MPL was not distributed with this
|
Chris@49
|
6 // file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
Chris@49
|
7
|
Chris@49
|
8
|
Chris@49
|
9 //! \addtogroup glue_solve
|
Chris@49
|
10 //! @{
|
Chris@49
|
11
|
Chris@49
|
12
|
Chris@49
|
13
|
Chris@49
|
14 template<typename eT, typename T2>
|
Chris@49
|
15 inline
|
Chris@49
|
16 void
|
Chris@49
|
17 glue_solve::solve_direct(Mat<eT>& out, Mat<eT>& A, const Base<eT,T2>& X, const bool slow)
|
Chris@49
|
18 {
|
Chris@49
|
19 arma_extra_debug_sigprint();
|
Chris@49
|
20
|
Chris@49
|
21 const uword A_n_rows = A.n_rows;
|
Chris@49
|
22 const uword A_n_cols = A.n_cols;
|
Chris@49
|
23
|
Chris@49
|
24 bool status = false;
|
Chris@49
|
25
|
Chris@49
|
26 if(A_n_rows == A_n_cols)
|
Chris@49
|
27 {
|
Chris@49
|
28 status = auxlib::solve(out, A, X, slow);
|
Chris@49
|
29 }
|
Chris@49
|
30 else
|
Chris@49
|
31 if(A_n_rows > A_n_cols)
|
Chris@49
|
32 {
|
Chris@49
|
33 arma_extra_debug_print("solve(): detected over-determined system");
|
Chris@49
|
34 status = auxlib::solve_od(out, A, X);
|
Chris@49
|
35 }
|
Chris@49
|
36 else
|
Chris@49
|
37 {
|
Chris@49
|
38 arma_extra_debug_print("solve(): detected under-determined system");
|
Chris@49
|
39 status = auxlib::solve_ud(out, A, X);
|
Chris@49
|
40 }
|
Chris@49
|
41
|
Chris@49
|
42 if(status == false)
|
Chris@49
|
43 {
|
Chris@49
|
44 out.reset();
|
Chris@49
|
45 arma_bad("solve(): solution not found");
|
Chris@49
|
46 }
|
Chris@49
|
47 }
|
Chris@49
|
48
|
Chris@49
|
49
|
Chris@49
|
50
|
Chris@49
|
51 template<typename T1, typename T2>
|
Chris@49
|
52 inline
|
Chris@49
|
53 void
|
Chris@49
|
54 glue_solve::apply(Mat<typename T1::elem_type>& out, const Glue<T1,T2,glue_solve>& X)
|
Chris@49
|
55 {
|
Chris@49
|
56 arma_extra_debug_sigprint();
|
Chris@49
|
57
|
Chris@49
|
58 typedef typename T1::elem_type eT;
|
Chris@49
|
59
|
Chris@49
|
60 Mat<eT> A = X.A.get_ref();
|
Chris@49
|
61
|
Chris@49
|
62 glue_solve::solve_direct( out, A, X.B, (X.aux_uword == 1) );
|
Chris@49
|
63 }
|
Chris@49
|
64
|
Chris@49
|
65
|
Chris@49
|
66
|
Chris@49
|
67 template<typename T1, typename T2>
|
Chris@49
|
68 inline
|
Chris@49
|
69 void
|
Chris@49
|
70 glue_solve_tr::apply(Mat<typename T1::elem_type>& out, const Glue<T1,T2,glue_solve_tr>& X)
|
Chris@49
|
71 {
|
Chris@49
|
72 arma_extra_debug_sigprint();
|
Chris@49
|
73
|
Chris@49
|
74 typedef typename T1::elem_type eT;
|
Chris@49
|
75
|
Chris@49
|
76 const unwrap_check<T1> A_tmp(X.A, out);
|
Chris@49
|
77 const unwrap_check<T2> B_tmp(X.B, out);
|
Chris@49
|
78
|
Chris@49
|
79 const Mat<eT>& A = A_tmp.M;
|
Chris@49
|
80 const Mat<eT>& B = B_tmp.M;
|
Chris@49
|
81
|
Chris@49
|
82 bool err_state = false;
|
Chris@49
|
83 char* err_msg = 0;
|
Chris@49
|
84
|
Chris@49
|
85 arma_debug_set_error( err_state, err_msg, ((&A) == (&B)), "solve(): A is an alias of B" );
|
Chris@49
|
86 arma_debug_set_error( err_state, err_msg, (A.n_rows != B.n_rows), "solve(): number of rows in A and B must be the same" );
|
Chris@49
|
87 arma_debug_set_error( err_state, err_msg, (A.is_square() == false), "solve(): A is not a square matrix" );
|
Chris@49
|
88
|
Chris@49
|
89 arma_debug_check(err_state, err_msg);
|
Chris@49
|
90
|
Chris@49
|
91 const bool status = auxlib::solve_tr(out, A, B, X.aux_uword);
|
Chris@49
|
92
|
Chris@49
|
93 if(status == false)
|
Chris@49
|
94 {
|
Chris@49
|
95 out.reset();
|
Chris@49
|
96 arma_bad("solve(): solution not found");
|
Chris@49
|
97 }
|
Chris@49
|
98 }
|
Chris@49
|
99
|
Chris@49
|
100
|
Chris@49
|
101
|
Chris@49
|
102 //! @}
|