Как выполнить операцию над подмножеством элементов в Boost::uBlas::vector?
Предположим, у вас есть длинный boost::numeric::ublas::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))
Проблема в том, что это выглядит довольно неэффективно: не убла бы ли вычислить весь вектор, а затем просто выбросить все неиспользуемые значения в этом случае (т.е. где 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()]);
Проблема в том, что а) это выглядит ужасно, б) что-то вроде победы над целью использования векторов в первую очередь и в) должно быть ужасно неэффективно, если нужно обновить множество индексов и / или операция становится более сложной,
Любые идеи о том, как сделать это эффективно? Я почти уверен, что это довольно распространенная проблема, но я не смог найти в ней ничего полезного (а документация UBLAS... не веселая).