ViennaCL - The Vienna Computing Library
1.5.2
|
00001 #ifndef VIENNACL_LINALG_TOEPLITZ_MATRIX_OPERATIONS_HPP_ 00002 #define VIENNACL_LINALG_TOEPLITZ_MATRIX_OPERATIONS_HPP_ 00003 00004 /* ========================================================================= 00005 Copyright (c) 2010-2014, Institute for Microelectronics, 00006 Institute for Analysis and Scientific Computing, 00007 TU Wien. 00008 Portions of this software are copyright by UChicago Argonne, LLC. 00009 00010 ----------------- 00011 ViennaCL - The Vienna Computing Library 00012 ----------------- 00013 00014 Project Head: Karl Rupp rupp@iue.tuwien.ac.at 00015 00016 (A list of authors and contributors can be found in the PDF manual) 00017 00018 License: MIT (X11), see file LICENSE in the base directory 00019 ============================================================================= */ 00020 00025 #include "viennacl/forwards.h" 00026 #include "viennacl/ocl/backend.hpp" 00027 #include "viennacl/scalar.hpp" 00028 #include "viennacl/vector.hpp" 00029 #include "viennacl/tools/tools.hpp" 00030 #include "viennacl/fft.hpp" 00031 00032 namespace viennacl 00033 { 00034 namespace linalg 00035 { 00036 00037 00038 // A * x 00039 00048 template<class SCALARTYPE, unsigned int ALIGNMENT> 00049 void prod_impl(const viennacl::toeplitz_matrix<SCALARTYPE, ALIGNMENT> & mat, 00050 const viennacl::vector_base<SCALARTYPE> & vec, 00051 viennacl::vector_base<SCALARTYPE> & result) 00052 { 00053 assert(mat.size1() == result.size()); 00054 assert(mat.size2() == vec.size()); 00055 00056 viennacl::vector<SCALARTYPE> tmp(vec.size() * 4); tmp.clear(); 00057 viennacl::vector<SCALARTYPE> tmp2(vec.size() * 4); 00058 00059 viennacl::vector<SCALARTYPE> tep(mat.elements().size() * 2); 00060 viennacl::detail::fft::real_to_complex(mat.elements(), tep, mat.elements().size()); 00061 00062 00063 00064 copy(vec, tmp); 00065 viennacl::detail::fft::real_to_complex(tmp, tmp2, vec.size() * 2); 00066 viennacl::linalg::convolve(tep, tmp2, tmp); 00067 viennacl::detail::fft::complex_to_real(tmp, tmp2, vec.size() * 2); 00068 copy(tmp2.begin(), tmp2.begin() + static_cast<vcl_ptrdiff_t>(vec.size()), result.begin()); 00069 } 00070 00071 } //namespace linalg 00072 00073 00074 00075 } //namespace viennacl 00076 00077 00078 #endif