Как умножить вектор удвоения uBLAS Boost со сложным двойным множителем?

Можно ли рассчитать поэлементное произведение вектора uBLAS для двойников с комплексным двойником? Следующий код не может быть скомпилирован, так как не может найти перегруженный оператор *. Я ожидаю, что это сработает, поскольку умножение двойного на сложное двойное хорошо определено.

#include <complex>

#include <boost/numeric/ublas/vector.hpp>
#include <boost/numeric/ublas/io.hpp>

int main(int argc, char **argv)
{
using namespace boost::numeric::ublas;

vector<double> v(3);
for (unsigned i = 0; i < v.size(); ++i)
{
v (i) = i;
}

vector<std::complex<double> > w = v * std::complex<double>(3.0, -1.0);

return 0;
}

Компиляция этого с использованием GCC 4.6 и Boost 1.55.0 дает следующее:

error: no match for ‘operator*’ (operand types are ‘boost::numeric::ublas::vector<double>’ and ‘std::complex<double>’)

0

Решение

Посмотрев на перегруженный оператор * в vector_expression.hpp:

// (t * v) [i] = t * v [i]
template<class T1, class E2>
BOOST_UBLAS_INLINE
typename enable_if< is_convertible<T1, typename E2::value_type >,
typename vector_binary_scalar1_traits<const T1, E2, scalar_multiplies<T1, typename E2::value_type> >::result_type
>::type
operator * (const T1 &e1,
const vector_expression<E2> &e2) {
typedef typename vector_binary_scalar1_traits<const T1, E2, scalar_multiplies<T1, typename E2::value_type> >::expression_type expression_type;
return expression_type (e1, e2 ());
}

Похоже, что проблема заключается в выводе is_convertible, он не идет в обе стороны, так как в этом случае нет преобразования из std :: complex в удвоение, он не работает. Я добавил новое определение, меняя порядок аргументов в этом шаблоне, и оно работает …

Извините за плохой английский

1

Другие решения


А ты уже прошел курс программирования? Супер скидка!
Прокачать скилл $$$
×