Я нашел способ заставить его работать.
этап 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
наконец, вызовите transform:
bc::transform(begin_a, end_a, begin_b, result.begin(), bc::atan2<float>()); // atan(b/a)
bc::system::default_queue().finish();