nick maxwell
nick maxwell

Reputation: 1509

How to fill an xtensor array, with complex data type

Paraphrasing here, but this is the problem

xt::pyarray< std::complex<double> > output;
output = 0; // fails to compile
output = double(0); // also fails to compile
output = complex<double>(0); // succeeds

and yet this is fine

std::complex<double> foo;
foo = double(0);

The problem is I'm writing a function which accepts arbitrary xtensor array, eg.

template<typename xtarray_t>
void my_function(xtarray_t &output, const xtarray_t &input) {
    output = 0;
}

so in general this

output = complex<double>(0);

would fail. I've seen this, but am not sure if this was implemented, or how to use it, couldn't find the documentation. In general though, I think it should still work with std::complex.

thanks for any help!

compiler output:

xtensor-python/include/xtensor-python/pyarray.hpp:360:20: note: candidate function not viable: no known conversion from 'double' to 'const xt::pyarray<std::__1::complex<double>, xt::layout_type::dynamic>::self_type' (aka 'const pyarray<std::__1::complex<double>, (xt::layout_type)0>') for 1st argument 
    self_type& operator=(const self_type& rhs);

xtensor-python/include/xtensor-python/pyarray.hpp:363:20: note: candidate function not viable: no known conversion from 'double' to 'xt::pyarray<std::__1::complex<double>, xt::layout_type::dynamic>::self_type' (aka 'pyarray<std::__1::complex<double>, (xt::layout_type)0>') for 1st argument
    self_type& operator=(self_type&& e) = default;

xtensor-python/include/xtensor-python/pyarray.hpp:369:20: note: candidate template ignored: could not match 'xexpression<type-parameter-0-0>' against 'double'
    self_type& operator=(const xexpression<E>& e);

Upvotes: 1

Views: 284

Answers (1)

nick maxwell
nick maxwell

Reputation: 1509

Answer is to do this

using value_t = typename xtarray_t::value_type;
output = value_t(0);

Upvotes: 1

Related Questions