2014-09-01 7 views
0

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

#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 и Повысьте 1.55.0 дает следующее:

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

Как вы определяете (0, 1, 2) * (3, - 1)? – Nelfeal

ответ

1

Глядя на перегруженного оператора * в 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, чтобы удвоить в этом случае, это не сработает. Я добавил новое определение только поменяв порядок аргументов в этом шаблоне, и она работает ...

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