假设你有一个很长的boost :: numeric :: ublas :: vector,你想对元素的子集执行更新操作 . 应该更新多少元素介于“全部”或“无”之间 . 哪个要更新的元素由稀疏的compressed_vector给出,每个元素应该更新一个“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)

如果只需要更新一些元素,这将是非常低效的 .

  • 循环所有要更新的值
[....]
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文档......并不好玩) .