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