Как выполнить операцию над подмножеством элементов в Boost :: uBlas :: vector?

Предположим, у вас есть длинный boost :: numeric :: ublas :: vector, и вы хотите выполнить операцию обновления для подмножества элементов. Сколько элементов должно быть обновлено, где-то между «все» или «нет».
Какие элементы для обновления задаются разреженным сжатым вектором, содержащим «1» для каждого элемента, который должен быть обновлен.

Я мог бы придумать два пути решения этой проблемы:

  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)
    

    что было бы ужасно неэффективно, если нужно обновить только несколько элементов.

  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()]);
    

    Проблема в том, что а) это выглядит ужасно, б) что-то вроде победы над целью использования векторов в первую очередь и в) должно быть ужасно неэффективно, если нужно обновить множество индексов и / или операция становится более сложной ,

Любые идеи о том, как сделать это эффективно? Я почти уверен, что это довольно распространенная проблема, но я не смог найти в ней ничего полезного (а документация по Ublas … неинтересна).

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …