glue_kron_meat.hpp
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 template<typename eT>
00026 inline
00027 void
00028 glue_kron::direct_kron(Mat<eT>& out, const Mat<eT>& A, const Mat<eT>& B)
00029 {
00030 arma_extra_debug_sigprint();
00031
00032 const u32 A_rows = A.n_rows;
00033 const u32 A_cols = A.n_cols;
00034 const u32 B_rows = B.n_rows;
00035 const u32 B_cols = B.n_cols;
00036
00037 out.set_size(A_rows*B_rows, A_cols*B_cols);
00038
00039 for(u32 i = 0; i < A_rows; i++)
00040 {
00041 for(u32 j = 0; j < A_cols; j++)
00042 {
00043 out.submat(i*B_rows, j*B_cols, (i+1)*B_rows-1, (j+1)*B_cols-1) = A(i,j) * B;
00044 }
00045 }
00046 }
00047
00048
00049
00050
00051
00052
00053 template<typename T>
00054 inline
00055 void
00056 glue_kron::direct_kron(Mat< std::complex<T> >& out, const Mat< std::complex<T> >& A, const Mat<T>& B)
00057 {
00058 arma_extra_debug_sigprint();
00059
00060 typedef typename std::complex<T> eT;
00061
00062 const u32 A_rows = A.n_rows;
00063 const u32 A_cols = A.n_cols;
00064 const u32 B_rows = B.n_rows;
00065 const u32 B_cols = B.n_cols;
00066
00067 out.set_size(A_rows*B_rows, A_cols*B_cols);
00068
00069 Mat<eT> tmp_B = conv_to< Mat<eT> >::from(B);
00070
00071 for(u32 i = 0; i < A_rows; i++)
00072 {
00073 for(u32 j = 0; j < A_cols; j++)
00074 {
00075 out.submat(i*B_rows, j*B_cols, (i+1)*B_rows-1, (j+1)*B_cols-1) = A(i,j) * tmp_B;
00076 }
00077 }
00078 }
00079
00080
00081
00082
00083
00084
00085 template<typename T>
00086 inline
00087 void
00088 glue_kron::direct_kron(Mat< std::complex<T> >& out, const Mat<T>& A, const Mat< std::complex<T> >& B)
00089 {
00090 arma_extra_debug_sigprint();
00091
00092 const u32 A_rows = A.n_rows;
00093 const u32 A_cols = A.n_cols;
00094 const u32 B_rows = B.n_rows;
00095 const u32 B_cols = B.n_cols;
00096
00097 out.set_size(A_rows*B_rows, A_cols*B_cols);
00098
00099 for(u32 i = 0; i < A_rows; i++)
00100 {
00101 for(u32 j = 0; j < A_cols; j++)
00102 {
00103 out.submat(i*B_rows, j*B_cols, (i+1)*B_rows-1, (j+1)*B_cols-1) = A(i,j) * B;
00104 }
00105 }
00106 }
00107
00108
00109
00110
00111
00112 template<typename T1, typename T2>
00113 inline
00114 void
00115 glue_kron::apply(Mat<typename T1::elem_type>& out, const Glue<T1,T2,glue_kron>& X)
00116 {
00117 arma_extra_debug_sigprint();
00118
00119 typedef typename T1::elem_type eT;
00120
00121 const unwrap_check<T1> A_tmp(X.A, out);
00122 const unwrap_check<T2> B_tmp(X.B, out);
00123
00124 const Mat<eT>& A = A_tmp.M;
00125 const Mat<eT>& B = B_tmp.M;
00126
00127 glue_kron::direct_kron(out, A, B);
00128 }
00129
00130
00131
00132