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 glue_kron
|
Chris@49
|
11 //! @{
|
Chris@49
|
12
|
Chris@49
|
13
|
Chris@49
|
14
|
Chris@49
|
15 //! \brief
|
Chris@49
|
16 //! both input matrices have the same element type
|
Chris@49
|
17 template<typename eT>
|
Chris@49
|
18 inline
|
Chris@49
|
19 void
|
Chris@49
|
20 glue_kron::direct_kron(Mat<eT>& out, const Mat<eT>& A, const Mat<eT>& B)
|
Chris@49
|
21 {
|
Chris@49
|
22 arma_extra_debug_sigprint();
|
Chris@49
|
23
|
Chris@49
|
24 const uword A_rows = A.n_rows;
|
Chris@49
|
25 const uword A_cols = A.n_cols;
|
Chris@49
|
26 const uword B_rows = B.n_rows;
|
Chris@49
|
27 const uword B_cols = B.n_cols;
|
Chris@49
|
28
|
Chris@49
|
29 out.set_size(A_rows*B_rows, A_cols*B_cols);
|
Chris@49
|
30
|
Chris@49
|
31 for(uword i = 0; i < A_rows; i++)
|
Chris@49
|
32 {
|
Chris@49
|
33 for(uword j = 0; j < A_cols; j++)
|
Chris@49
|
34 {
|
Chris@49
|
35 out.submat(i*B_rows, j*B_cols, (i+1)*B_rows-1, (j+1)*B_cols-1) = A(i,j) * B;
|
Chris@49
|
36 }
|
Chris@49
|
37 }
|
Chris@49
|
38 }
|
Chris@49
|
39
|
Chris@49
|
40
|
Chris@49
|
41
|
Chris@49
|
42 //! \brief
|
Chris@49
|
43 //! different types of input matrices
|
Chris@49
|
44 //! A -> complex, B -> basic element type
|
Chris@49
|
45 template<typename T>
|
Chris@49
|
46 inline
|
Chris@49
|
47 void
|
Chris@49
|
48 glue_kron::direct_kron(Mat< std::complex<T> >& out, const Mat< std::complex<T> >& A, const Mat<T>& B)
|
Chris@49
|
49 {
|
Chris@49
|
50 arma_extra_debug_sigprint();
|
Chris@49
|
51
|
Chris@49
|
52 typedef typename std::complex<T> eT;
|
Chris@49
|
53
|
Chris@49
|
54 const uword A_rows = A.n_rows;
|
Chris@49
|
55 const uword A_cols = A.n_cols;
|
Chris@49
|
56 const uword B_rows = B.n_rows;
|
Chris@49
|
57 const uword B_cols = B.n_cols;
|
Chris@49
|
58
|
Chris@49
|
59 out.set_size(A_rows*B_rows, A_cols*B_cols);
|
Chris@49
|
60
|
Chris@49
|
61 Mat<eT> tmp_B = conv_to< Mat<eT> >::from(B);
|
Chris@49
|
62
|
Chris@49
|
63 for(uword i = 0; i < A_rows; i++)
|
Chris@49
|
64 {
|
Chris@49
|
65 for(uword j = 0; j < A_cols; j++)
|
Chris@49
|
66 {
|
Chris@49
|
67 out.submat(i*B_rows, j*B_cols, (i+1)*B_rows-1, (j+1)*B_cols-1) = A(i,j) * tmp_B;
|
Chris@49
|
68 }
|
Chris@49
|
69 }
|
Chris@49
|
70 }
|
Chris@49
|
71
|
Chris@49
|
72
|
Chris@49
|
73
|
Chris@49
|
74 //! \brief
|
Chris@49
|
75 //! different types of input matrices
|
Chris@49
|
76 //! A -> basic element type, B -> complex
|
Chris@49
|
77 template<typename T>
|
Chris@49
|
78 inline
|
Chris@49
|
79 void
|
Chris@49
|
80 glue_kron::direct_kron(Mat< std::complex<T> >& out, const Mat<T>& A, const Mat< std::complex<T> >& B)
|
Chris@49
|
81 {
|
Chris@49
|
82 arma_extra_debug_sigprint();
|
Chris@49
|
83
|
Chris@49
|
84 const uword A_rows = A.n_rows;
|
Chris@49
|
85 const uword A_cols = A.n_cols;
|
Chris@49
|
86 const uword B_rows = B.n_rows;
|
Chris@49
|
87 const uword B_cols = B.n_cols;
|
Chris@49
|
88
|
Chris@49
|
89 out.set_size(A_rows*B_rows, A_cols*B_cols);
|
Chris@49
|
90
|
Chris@49
|
91 for(uword i = 0; i < A_rows; i++)
|
Chris@49
|
92 {
|
Chris@49
|
93 for(uword j = 0; j < A_cols; j++)
|
Chris@49
|
94 {
|
Chris@49
|
95 out.submat(i*B_rows, j*B_cols, (i+1)*B_rows-1, (j+1)*B_cols-1) = A(i,j) * B;
|
Chris@49
|
96 }
|
Chris@49
|
97 }
|
Chris@49
|
98 }
|
Chris@49
|
99
|
Chris@49
|
100
|
Chris@49
|
101
|
Chris@49
|
102 //! \brief
|
Chris@49
|
103 //! apply Kronecker product for two objects with same element type
|
Chris@49
|
104 template<typename T1, typename T2>
|
Chris@49
|
105 inline
|
Chris@49
|
106 void
|
Chris@49
|
107 glue_kron::apply(Mat<typename T1::elem_type>& out, const Glue<T1,T2,glue_kron>& X)
|
Chris@49
|
108 {
|
Chris@49
|
109 arma_extra_debug_sigprint();
|
Chris@49
|
110
|
Chris@49
|
111 typedef typename T1::elem_type eT;
|
Chris@49
|
112
|
Chris@49
|
113 const unwrap_check<T1> A_tmp(X.A, out);
|
Chris@49
|
114 const unwrap_check<T2> B_tmp(X.B, out);
|
Chris@49
|
115
|
Chris@49
|
116 const Mat<eT>& A = A_tmp.M;
|
Chris@49
|
117 const Mat<eT>& B = B_tmp.M;
|
Chris@49
|
118
|
Chris@49
|
119 glue_kron::direct_kron(out, A, B);
|
Chris@49
|
120 }
|
Chris@49
|
121
|
Chris@49
|
122
|
Chris@49
|
123
|
Chris@49
|
124 //! @}
|