glue_kron_meat.hpp
Go to the documentation of this file.
00001 // Copyright (C) 2009-2010 NICTA (www.nicta.com.au)
00002 // Copyright (C) 2009-2010 Conrad Sanderson
00003 // Copyright (C) 2009-2010 Dimitrios Bouzas
00004 // 
00005 // This file is part of the Armadillo C++ library.
00006 // It is provided without any warranty of fitness
00007 // for any purpose. You can redistribute this file
00008 // and/or modify it under the terms of the GNU
00009 // Lesser General Public License (LGPL) as published
00010 // by the Free Software Foundation, either version 3
00011 // of the License or (at your option) any later version.
00012 // (see http://www.opensource.org/licenses for more info)
00013 
00014 
00017 
00018 
00019 
00022 template<typename eT>
00023 inline
00024 void
00025 glue_kron::direct_kron(Mat<eT>& out, const Mat<eT>& A, const Mat<eT>& B)
00026   {
00027   arma_extra_debug_sigprint();
00028   
00029   const uword A_rows = A.n_rows;
00030   const uword A_cols = A.n_cols;
00031   const uword B_rows = B.n_rows;
00032   const uword B_cols = B.n_cols;
00033   
00034   out.set_size(A_rows*B_rows, A_cols*B_cols);
00035   
00036   for(uword i = 0; i < A_rows; i++)
00037     {
00038     for(uword j = 0; j < A_cols; j++)
00039       {
00040       out.submat(i*B_rows, j*B_cols, (i+1)*B_rows-1, (j+1)*B_cols-1) = A(i,j) * B; 
00041       }
00042     }  
00043   }
00044 
00045 
00046 
00050 template<typename T>
00051 inline
00052 void
00053 glue_kron::direct_kron(Mat< std::complex<T> >& out, const Mat< std::complex<T> >& A, const Mat<T>& B)
00054   {
00055   arma_extra_debug_sigprint();
00056   
00057   typedef typename std::complex<T> eT;
00058   
00059   const uword A_rows = A.n_rows;
00060   const uword A_cols = A.n_cols;
00061   const uword B_rows = B.n_rows;
00062   const uword B_cols = B.n_cols;
00063   
00064   out.set_size(A_rows*B_rows, A_cols*B_cols);
00065   
00066   Mat<eT> tmp_B = conv_to< Mat<eT> >::from(B);
00067   
00068   for(uword i = 0; i < A_rows; i++)
00069     {
00070     for(uword j = 0; j < A_cols; j++)
00071       {
00072       out.submat(i*B_rows, j*B_cols, (i+1)*B_rows-1, (j+1)*B_cols-1) = A(i,j) * tmp_B; 
00073       }
00074     }  
00075   }
00076 
00077 
00078 
00082 template<typename T>
00083 inline
00084 void
00085 glue_kron::direct_kron(Mat< std::complex<T> >& out, const Mat<T>& A, const Mat< std::complex<T> >& B)
00086   {
00087   arma_extra_debug_sigprint();
00088   
00089   const uword A_rows = A.n_rows;
00090   const uword A_cols = A.n_cols;
00091   const uword B_rows = B.n_rows;
00092   const uword B_cols = B.n_cols;
00093   
00094   out.set_size(A_rows*B_rows, A_cols*B_cols);
00095   
00096   for(uword i = 0; i < A_rows; i++)
00097     {
00098     for(uword j = 0; j < A_cols; j++)
00099       {
00100       out.submat(i*B_rows, j*B_cols, (i+1)*B_rows-1, (j+1)*B_cols-1) = A(i,j) * B; 
00101       }
00102     }  
00103   }
00104 
00105 
00106 
00109 template<typename T1, typename T2>
00110 inline
00111 void
00112 glue_kron::apply(Mat<typename T1::elem_type>& out, const Glue<T1,T2,glue_kron>& X)
00113   {
00114   arma_extra_debug_sigprint();
00115   
00116   typedef typename T1::elem_type eT;
00117   
00118   const unwrap_check<T1> A_tmp(X.A, out);
00119   const unwrap_check<T2> B_tmp(X.B, out);
00120   
00121   const Mat<eT>& A = A_tmp.M;
00122   const Mat<eT>& B = B_tmp.M;
00123   
00124   glue_kron::direct_kron(out, A, B); 
00125   }
00126 
00127 
00128 


armadillo_matrix
Author(s): Conrad Sanderson - NICTA (www.nicta.com.au), (Wrapper by Sjoerd van den Dries)
autogenerated on Tue Jan 7 2014 11:42:04