Glue_toeplitz

Classes

class  glue_toeplitz

Functions

template<typename T1 , typename T2 >
static void glue_toeplitz::apply (Mat< typename T1::elem_type > &out, const Glue< T1, T2, glue_toeplitz > &in)

Function Documentation

template<typename T1 , typename T2 >
void glue_toeplitz::apply ( Mat< typename T1::elem_type > &  out,
const Glue< T1, T2, glue_toeplitz > &  in 
) [inline, static, inherited]

Definition at line 26 of file glue_toeplitz_meat.hpp.

References Glue< T1, T2, glue_type >::A, Mat< eT >::at(), Glue< T1, T2, glue_type >::B, Mat< eT >::colptr(), Mat< eT >::is_vec(), unwrap_check< T1 >::M, Mat< eT >::memptr(), Mat< eT >::n_elem, and Mat< eT >::set_size().

00027   {
00028   arma_extra_debug_sigprint();
00029   
00030   typedef typename T1::elem_type eT;
00031   
00032   if( ((void*)(&in.A)) == ((void*)(&in.B)) )
00033     {
00034     arma_extra_debug_print("glue_toeplitz::apply(): one argument version");
00035     
00036     const unwrap_check<T1>  tmp(in.A, out);
00037     const Mat<eT>& A      = tmp.M;
00038     
00039     arma_debug_check( (A.is_vec() == false), "toeplitz(): input argument must be a vector" );
00040     
00041     const u32 N     = A.n_elem;
00042     const eT* A_mem = A.memptr();
00043     
00044     out.set_size(N,N);
00045     
00046     for(u32 col=0; col<N; ++col)
00047       {
00048       eT* col_mem = out.colptr(col);
00049       
00050       u32 i;
00051       
00052       i = col;
00053       for(u32 row=0; row<col; ++row, --i)
00054         {
00055         col_mem[row] = A_mem[i];
00056         }
00057       
00058       i = 0;
00059       for(u32 row=col; row<N; ++row, ++i)
00060         {
00061         col_mem[row] = A_mem[i];
00062         }      
00063       }
00064     }
00065   else
00066     {
00067     arma_extra_debug_print("glue_toeplitz::apply(): two argument version");
00068     
00069     const unwrap_check<T1> tmp1(in.A, out);
00070     const unwrap_check<T2> tmp2(in.B, out);
00071     
00072     const Mat<eT>& A = tmp1.M;
00073     const Mat<eT>& B = tmp2.M;
00074     
00075     arma_debug_check( ( (A.is_vec() == false) || (B.is_vec() == false) ), "toeplitz(): input arguments must be vectors" );
00076     
00077     const u32 A_N = A.n_elem;
00078     const u32 B_N = B.n_elem;
00079     
00080     const eT* A_mem = A.memptr();
00081     const eT* B_mem = B.memptr();
00082     
00083     out.set_size(A_N, B_N);
00084     
00085     for(u32 col=0; col<B_N; ++col)
00086       {
00087       eT* col_mem = out.colptr(col);
00088       
00089       u32 i = 0;
00090       for(u32 row=col; row<A_N; ++row, ++i)
00091         {
00092         col_mem[row] = A_mem[i];
00093         }
00094       }
00095     
00096     for(u32 row=0; row<A_N; ++row)
00097       {
00098       u32 i = 1;
00099       for(u32 col=(row+1); col<B_N; ++col, ++i)
00100         {
00101         out.at(row,col) = B_mem[i];
00102         }
00103       }
00104     
00105     }
00106   
00107   
00108   }