1

長いブースト::numeric:: ublas :: vectorがあり、要素のサブセットに対して更新操作を実行するとします。更新する必要のある要素の数は、「すべて」または「なし」の間のどこかにあります。更新する要素は、更新する必要のある要素ごとに「1」を含むスパースcompressed_vectorによって指定されます。

この問題を解決するには、次の2つの方法が考えられます。

  1. 右側にマスクを掛けるだけです。

    using namespace boost::numeric::ublas;
    vector<double> x,some,other,stuff;
    compressed_vector<int> update_mask;
    [...]
    noalias(x) += element_prod(update_mask, some+element_div(other,stuff))
    

    これに伴う問題は、それが非常に非効率に見えることです。ublasはベクトル全体を計算してから、この場合(つまり、update_mask == 0の場合)すべての未使用の値を破棄しませんか?

    ただよりも遅くなると思います

    noalias(x) += some+element_div(other,stuff)
    

    更新する必要のある要素が少ない場合、これはひどく非効率的です。

  2. すべての値をループして更新します

    [....]
    for(compressed_vector<int>::iterator it = update_mask.begin(); it!=update_mask.end(); ++it)
        x[it.index()] += some[it.index()]+other[it.index()]/stuff[it.index()]);
    

    これに伴う問題は、a)見た目がひどい、b)そもそもベクトルを使用する目的をやや損なう、c。)多くのインデックスを更新する場合、および/または操作がより複雑になる場合、ひどく非効率になるはずであるということです。 。

これを効率的に行う方法について何かアイデアはありますか?これはかなり一般的な問題であると確信していますが、それについて役立つものは何も見つかりませんでした(そして、ublasのドキュメントは...面白くありません)。

4

0 に答える 0