Chris@49
|
1 // Copyright (C) 2011-2012 NICTA (www.nicta.com.au)
|
Chris@49
|
2 // Copyright (C) 2011-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 fn_syl_lyap
|
Chris@49
|
10 //! @{
|
Chris@49
|
11
|
Chris@49
|
12
|
Chris@49
|
13 //! find the solution of the Sylvester equation AX + XB = C
|
Chris@49
|
14 template<typename T1, typename T2, typename T3>
|
Chris@49
|
15 inline
|
Chris@49
|
16 bool
|
Chris@49
|
17 syl
|
Chris@49
|
18 (
|
Chris@49
|
19 Mat <typename T1::elem_type> & out,
|
Chris@49
|
20 const Base<typename T1::elem_type,T1>& in_A,
|
Chris@49
|
21 const Base<typename T1::elem_type,T2>& in_B,
|
Chris@49
|
22 const Base<typename T1::elem_type,T3>& in_C,
|
Chris@49
|
23 const typename arma_blas_type_only<typename T1::elem_type>::result* junk = 0
|
Chris@49
|
24 )
|
Chris@49
|
25 {
|
Chris@49
|
26 arma_extra_debug_sigprint();
|
Chris@49
|
27 arma_ignore(junk);
|
Chris@49
|
28
|
Chris@49
|
29 typedef typename T1::elem_type eT;
|
Chris@49
|
30
|
Chris@49
|
31 const unwrap_check<T1> tmp_A(in_A.get_ref(), out);
|
Chris@49
|
32 const unwrap_check<T2> tmp_B(in_B.get_ref(), out);
|
Chris@49
|
33 const unwrap_check<T3> tmp_C(in_C.get_ref(), out);
|
Chris@49
|
34
|
Chris@49
|
35 const Mat<eT>& A = tmp_A.M;
|
Chris@49
|
36 const Mat<eT>& B = tmp_B.M;
|
Chris@49
|
37 const Mat<eT>& C = tmp_C.M;
|
Chris@49
|
38
|
Chris@49
|
39 const bool status = auxlib::syl(out, A, B, C);
|
Chris@49
|
40
|
Chris@49
|
41 if(status == false)
|
Chris@49
|
42 {
|
Chris@49
|
43 out.reset();
|
Chris@49
|
44 arma_bad("syl(): equation appears to be singular", false);
|
Chris@49
|
45 }
|
Chris@49
|
46
|
Chris@49
|
47 return status;
|
Chris@49
|
48 }
|
Chris@49
|
49
|
Chris@49
|
50
|
Chris@49
|
51
|
Chris@49
|
52 template<typename T1, typename T2, typename T3>
|
Chris@49
|
53 inline
|
Chris@49
|
54 Mat<typename T1::elem_type>
|
Chris@49
|
55 syl
|
Chris@49
|
56 (
|
Chris@49
|
57 const Base<typename T1::elem_type,T1>& in_A,
|
Chris@49
|
58 const Base<typename T1::elem_type,T2>& in_B,
|
Chris@49
|
59 const Base<typename T1::elem_type,T3>& in_C,
|
Chris@49
|
60 const typename arma_blas_type_only<typename T1::elem_type>::result* junk = 0
|
Chris@49
|
61 )
|
Chris@49
|
62 {
|
Chris@49
|
63 arma_extra_debug_sigprint();
|
Chris@49
|
64 arma_ignore(junk);
|
Chris@49
|
65
|
Chris@49
|
66 typedef typename T1::elem_type eT;
|
Chris@49
|
67
|
Chris@49
|
68 const unwrap<T1> tmp_A( in_A.get_ref() );
|
Chris@49
|
69 const unwrap<T2> tmp_B( in_B.get_ref() );
|
Chris@49
|
70 const unwrap<T3> tmp_C( in_C.get_ref() );
|
Chris@49
|
71
|
Chris@49
|
72 const Mat<eT>& A = tmp_A.M;
|
Chris@49
|
73 const Mat<eT>& B = tmp_B.M;
|
Chris@49
|
74 const Mat<eT>& C = tmp_C.M;
|
Chris@49
|
75
|
Chris@49
|
76 Mat<eT> out;
|
Chris@49
|
77
|
Chris@49
|
78 const bool status = auxlib::syl(out, A, B, C);
|
Chris@49
|
79
|
Chris@49
|
80 if(status == false)
|
Chris@49
|
81 {
|
Chris@49
|
82 out.reset();
|
Chris@49
|
83 arma_bad("syl(): equation appears to be singular");
|
Chris@49
|
84 }
|
Chris@49
|
85
|
Chris@49
|
86 return out;
|
Chris@49
|
87 }
|
Chris@49
|
88
|
Chris@49
|
89
|
Chris@49
|
90
|
Chris@49
|
91 //! @}
|