5

boost::ublas は、要素ごとの操作と一連の操作をうまくサポートしていないことがわかりました (ただし、効率はかなり高いです :)) 私はしようとしています

D = A^2 .* B^3 .* C

ここで、A、B、C はすべて同じサイズの正方行列です。演算子 ".*" は要素ごとの演算を表し、^ は行列の累乗です。boost:ublas で、私は書きました

for (int n=0; n<300; n++)
{
  for (int k=0; k<300; k++)
  {
    D(n, k) = pow(abs(A(n, k)), 2)*pow(abs(B(n, k)), 3)*C(n, k);
  }
}

私のプログラムには、上記のような一連の操作がたくさんありますが、ループの代わりに 1 行のコードを使用しても同じ結果を得ることができますか?

また、次のように行列またはベクトルのすべての要素に定数を割り当てることは有効ではないように思われます

boost::numeric::ublas::vector v(100); v = 0.2;

代わりに、ループを使用して割り当てを再度行う必要があります。コードを節約するためのより良い方法はありますか? 私のアルゴリズムは非常に長く、上記のような退屈な操作が非常に多くあります。私は別の数値ライブラリ Armadillo を試しました。これは演算を単純化するための良い方法を提供しますが、現在は疎行列を想定していません (私のコードを実行するのに約 10 回かかります)。

4

1 に答える 1

3

ベクトルまたは行列に定数を簡単に割り当てることができます。

vector<double> v = scalar_vector<double>(100, 0.2);

通常のベクトル (ただし、c_vector または bounded_vector は除く) にはコンストラクターもあります。

vector<double> v(100, 0.2);

要素操作に関しては、独自の定型コードを簡単に定義することもできます。たとえば、絶対的な力のために:) :

namespace boost { namespace numeric { namespace ublas {
template<class M, class P>
struct scalar_power:
    public scalar_binary_functor<M, P> {
    typedef typename scalar_binary_functor<M, P>::argument1_type argument1_type;
    typedef typename scalar_binary_functor<M, P>::argument2_type argument2_type;
    typedef typename scalar_binary_functor<M, P>::result_type result_type;

    static BOOST_UBLAS_INLINE
    result_type apply (argument1_type t1, argument2_type t2) {
        return pow(abs(t1), t2);
    }
};

template<class M, class P>
BOOST_UBLAS_INLINE
typename enable_if< is_convertible<P, typename M::value_type>,
typename matrix_binary_scalar2_traits<M, const P, scalar_power<typename M::value_type, P> >::result_type
>::type
operator ^ (const matrix_expression<M> &m,
            const P &p) {
    typedef typename matrix_binary_scalar2_traits<M, const P, scalar_power<typename M::value_type, P> >::expression_type expression_type;
    return expression_type (m(), p);
}
}}}

この後、式は次のようになります。

D = element_prod(A^2, element_prod(B^3, C));
于 2012-06-22T13:14:22.143 に答える