0

複雑な double を持つ double の uBLAS ベクトルの要素ごとの積を計算することは可能ですか? 次のコードは、オーバーロードされた演算子 * が見つからないため、コンパイルに失敗します。double と複雑な double の乗算は明確に定義されているため、機能することが期待されます。

#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>’)                        
4

1 に答える 1

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 から double への変換がないため、機能しません。このテンプレートの引数の順序を入れ替えるだけの新しい定義を追加しましたが、機能します...

下手な英語でごめんなさい

于 2014-11-18T10:34:37.720 に答える