Собственная непостоянная замена матрицы для разреженного решателя

Я хочу использовать матричные свободные разреженные решатели с пользовательским объектом продукта матрицы-вектора. Вот отличный пример, как это сделать — https://eigen.tuxfamily.org/dox/group__MatrixfreeSolverExample.html

Но в этом примере пользовательский объект матрицы-продукта должен быть постоянным из-за сигнатуры generic_product_impl

template<typename Dest>
static void scaleAndAddTo(
Dest& dst,
const MatrixReplacement& lhs,
const Rhs& rhs,
const Scalar& alpha)

Во многих моих проблемах мне нужно много временных буферов для каждого вызова продукта. Разумно распределить их один раз, но я не могу хранить их внутри MatrixReplacement потому что это прошло как const.

Возможно ли в Eigen преодолеть эту проблему?

1

Решение

Есть два варианта:

  1. Использовать mutable ключевое слово для членов, которые должны изменить в const методы (т.е. ваши временные буферы). Это ключевое слово имеет смысл там, где наблюдается поведение вашего класса является const, несмотря на то, что вам нужно изменить членов. Примеры включают в себя кэшированные значения, мьютексы или ваши буферы.

  2. C ++ не совсем строг с распространением const, const unique_ptr<T> вернет (неконстантный) T& когда разыменовывается (потому что const говорит «вы не можете изменить указатель», а не «вы не можете изменить указатель»; это то же самое со встроенными указателями). Вы также можете обернуть свой «реальный» класс разреженной матрицы во что-то, что притворяется постоянным, но разрешает неконстантный доступ к матрице, если интеллектуальных указателей STL недостаточно. Если вы дадите ему подходящее имя, значит, это не так ужасно, как кажется.

Я рекомендую вариант 1.

3

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

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

По вопросам рекламы [email protected]