Я хочу использовать матричные свободные разреженные решатели с пользовательским объектом продукта матрицы-вектора. Вот отличный пример, как это сделать — 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 преодолеть эту проблему?
Есть два варианта:
Использовать mutable
ключевое слово для членов, которые должны изменить в const
методы (т.е. ваши временные буферы). Это ключевое слово имеет смысл там, где наблюдается поведение вашего класса является const, несмотря на то, что вам нужно изменить членов. Примеры включают в себя кэшированные значения, мьютексы или ваши буферы.
C ++ не совсем строг с распространением const
, const unique_ptr<T>
вернет (неконстантный) T&
когда разыменовывается (потому что const говорит «вы не можете изменить указатель», а не «вы не можете изменить указатель»; это то же самое со встроенными указателями). Вы также можете обернуть свой «реальный» класс разреженной матрицы во что-то, что притворяется постоянным, но разрешает неконстантный доступ к матрице, если интеллектуальных указателей STL недостаточно. Если вы дадите ему подходящее имя, значит, это не так ужасно, как кажется.
Я рекомендую вариант 1.
Других решений пока нет …