Chris@49
|
1 // Copyright (C) 2009-2010 NICTA (www.nicta.com.au)
|
Chris@49
|
2 // Copyright (C) 2009-2010 Conrad Sanderson
|
Chris@49
|
3 // Copyright (C) 2009-2010 Dimitrios Bouzas
|
Chris@49
|
4 //
|
Chris@49
|
5 // This Source Code Form is subject to the terms of the Mozilla Public
|
Chris@49
|
6 // License, v. 2.0. If a copy of the MPL was not distributed with this
|
Chris@49
|
7 // file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
Chris@49
|
8
|
Chris@49
|
9
|
Chris@49
|
10 //! \addtogroup fn_kron
|
Chris@49
|
11 //! @{
|
Chris@49
|
12
|
Chris@49
|
13
|
Chris@49
|
14
|
Chris@49
|
15 //! \brief
|
Chris@49
|
16 //! kronecker product of two matrices,
|
Chris@49
|
17 //! with the matrices having the same element type
|
Chris@49
|
18 template<typename T1, typename T2>
|
Chris@49
|
19 arma_inline
|
Chris@49
|
20 const Glue<T1,T2,glue_kron>
|
Chris@49
|
21 kron(const Base<typename T1::elem_type,T1>& A, const Base<typename T1::elem_type,T2>& B)
|
Chris@49
|
22 {
|
Chris@49
|
23 arma_extra_debug_sigprint();
|
Chris@49
|
24
|
Chris@49
|
25 return Glue<T1, T2, glue_kron>(A.get_ref(), B.get_ref());
|
Chris@49
|
26 }
|
Chris@49
|
27
|
Chris@49
|
28
|
Chris@49
|
29
|
Chris@49
|
30 //! \brief
|
Chris@49
|
31 //! kronecker product of two matrices,
|
Chris@49
|
32 //! with the matrices having different element types
|
Chris@49
|
33 template<typename T, typename T1, typename T2>
|
Chris@49
|
34 inline
|
Chris@49
|
35 Mat<typename eT_promoter<T1,T2>::eT>
|
Chris@49
|
36 kron(const Base<std::complex<T>,T1>& X, const Base<T,T2>& Y)
|
Chris@49
|
37 {
|
Chris@49
|
38 arma_extra_debug_sigprint();
|
Chris@49
|
39
|
Chris@49
|
40 typedef typename std::complex<T> eT1;
|
Chris@49
|
41
|
Chris@49
|
42 promote_type<eT1,T>::check();
|
Chris@49
|
43
|
Chris@49
|
44 const unwrap<T1> tmp1(X.get_ref());
|
Chris@49
|
45 const unwrap<T2> tmp2(Y.get_ref());
|
Chris@49
|
46
|
Chris@49
|
47 const Mat<eT1>& A = tmp1.M;
|
Chris@49
|
48 const Mat<T >& B = tmp2.M;
|
Chris@49
|
49
|
Chris@49
|
50 Mat<eT1> out;
|
Chris@49
|
51
|
Chris@49
|
52 glue_kron::direct_kron(out, A, B);
|
Chris@49
|
53
|
Chris@49
|
54 return out;
|
Chris@49
|
55 }
|
Chris@49
|
56
|
Chris@49
|
57
|
Chris@49
|
58
|
Chris@49
|
59 //! \brief
|
Chris@49
|
60 //! kronecker product of two matrices,
|
Chris@49
|
61 //! with the matrices having different element types
|
Chris@49
|
62 template<typename T, typename T1, typename T2>
|
Chris@49
|
63 inline
|
Chris@49
|
64 Mat<typename eT_promoter<T1,T2>::eT>
|
Chris@49
|
65 kron(const Base<T,T1>& X, const Base<std::complex<T>,T2>& Y)
|
Chris@49
|
66 {
|
Chris@49
|
67 arma_extra_debug_sigprint();
|
Chris@49
|
68
|
Chris@49
|
69 typedef typename std::complex<T> eT2;
|
Chris@49
|
70
|
Chris@49
|
71 promote_type<T,eT2>::check();
|
Chris@49
|
72
|
Chris@49
|
73 const unwrap<T1> tmp1(X.get_ref());
|
Chris@49
|
74 const unwrap<T2> tmp2(Y.get_ref());
|
Chris@49
|
75
|
Chris@49
|
76 const Mat<T >& A = tmp1.M;
|
Chris@49
|
77 const Mat<eT2>& B = tmp2.M;
|
Chris@49
|
78
|
Chris@49
|
79 Mat<eT2> out;
|
Chris@49
|
80
|
Chris@49
|
81 glue_kron::direct_kron(out, A, B);
|
Chris@49
|
82
|
Chris@49
|
83 return out;
|
Chris@49
|
84 }
|
Chris@49
|
85
|
Chris@49
|
86
|
Chris@49
|
87
|
Chris@49
|
88 //! @}
|