長いブースト::numeric:: ublas :: vectorがあり、要素のサブセットに対して更新操作を実行するとします。更新する必要のある要素の数は、「すべて」または「なし」の間のどこかにあります。更新する要素は、更新する必要のある要素ごとに「1」を含むスパースcompressed_vectorによって指定されます。
この問題を解決するには、次の2つの方法が考えられます。
右側にマスクを掛けるだけです。
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)
更新する必要のある要素が少ない場合、これはひどく非効率的です。
すべての値をループして更新します
[....] 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のドキュメントは...面白くありません)。