1 #ifndef _VIENNACL_CIRCULANT_MATRIX_HPP
2 #define _VIENNACL_CIRCULANT_MATRIX_HPP
39 template<
class SCALARTYPE,
unsigned int ALIGNMENT>
49 viennacl::linalg::kernels::fft<SCALARTYPE, 1>::init();
60 assert(rows == cols &&
"Circulant matrix must be square!");
61 viennacl::linalg::kernels::fft<SCALARTYPE, 1>::init();
70 void resize(
size_t sz,
bool preserve =
true)
72 elements_.resize(sz, preserve);
91 std::size_t
size1()
const {
return elements_.size(); }
96 std::size_t
size2()
const {
return elements_.size(); }
114 int index =
static_cast<int>(row_index) - static_cast<int>(col_index);
116 assert(row_index <
size1() && col_index <
size2() &&
"Invalid access");
120 return elements_[index];
148 template <
typename SCALARTYPE,
unsigned int ALIGNMENT>
151 assert(cpu_vec.size() == gpu_mat.
size1() &&
"Size mismatch");
161 template <
typename SCALARTYPE,
unsigned int ALIGNMENT>
164 assert(cpu_vec.size() == gpu_mat.
size1() &&
"Size mismatch");
174 template <
typename SCALARTYPE,
unsigned int ALIGNMENT,
typename MATRIXTYPE>
177 assert(size == com_dst.size1() &&
"Size mismatch");
178 assert(size == com_dst.size2() &&
"Size mismatch");
179 std::vector<SCALARTYPE> tmp(size);
182 for (std::size_t i = 0; i <
size; i++) {
183 for (std::size_t j = 0; j <
size; j++) {
184 int index =
static_cast<int>(i) - static_cast<int>(j);
186 index = size + index;
187 com_dst(i, j) = tmp[index];
198 template <
typename SCALARTYPE,
unsigned int ALIGNMENT,
typename MATRIXTYPE>
201 assert(size == com_src.size1() &&
"Size mismatch");
202 assert(size == com_src.size2() &&
"Size mismatch");
204 std::vector<SCALARTYPE> tmp(size);
206 for(std::size_t i = 0; i <
size; i++) tmp[i] = com_src(i, 0);
234 template<
class SCALARTYPE,
unsigned int ALIGNMENT>
235 std::ostream & operator<<(std::ostream& s, circulant_matrix<SCALARTYPE, ALIGNMENT>& gpu_matrix)
237 std::size_t
size = gpu_matrix.size1();
238 std::vector<SCALARTYPE> tmp(size);
239 copy(gpu_matrix, tmp);
240 s <<
"[" << size <<
"," << size <<
"](";
242 for(std::size_t i = 0; i <
size; i++) {
244 for(std::size_t j = 0; j <
size; j++) {
245 int index = (int)i - (
int)j;
246 if(index < 0) index = size + index;
249 if(j < (size - 1)) s <<
",";
258 #endif // _VIENNACL_CIRCULANT_MATRIX_HPP