Предположим, у вас есть длинный 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 … неинтересна).
Задача ещё не решена.
Других решений пока нет …