我找到了让它工作的方法。
阶段 1:分配 2 个向量:
bc::vector<std::complex<float>> vec{ {1.0f, 2.0f}, {3.0f, 4.0f}, {5.0f, 6.0f} };
bc::vector<float> result(3);
第 2 阶段:将复数向量解释为浮点缓冲区迭代器
buffer_iterator
当您有一个强类型向量并希望将其作为不同类型传递给算法时非常有用。
auto beginf = bc::make_buffer_iterator<float>(vec.get_buffer(), 0);
auto endf = bc::make_buffer_iterator<float>(vec.get_buffer(), 6); // note end point to final index + 1
第 3 阶段:定义跨步迭代器,以便我们可以使用与 tan2 的参数相同的缓冲区。每个迭代器以 2 个索引的步幅迭代缓冲区,并且它们为 tan2 提供对缓冲区的交错访问:
auto begin_a = bc::make_strided_iterator(beginf + 1, 2); // access imaginary part
auto end_a = bc::make_strided_iterator_end(beginf + 1, endf , 2);
auto begin_b = bc::make_strided_iterator(beginf, 2); // access real part
最后,调用变换:
bc::transform(begin_a, end_a, begin_b, result.begin(), bc::atan2<float>()); // atan(b/a)
bc::system::default_queue().finish();