Eigen: Можно ли создать LeastSquareDiagonalPreconditioner-подобный кондиционер, если я могу только вычислить Aty и Ax? - PullRequest
0 голосов
/ 08 ноября 2018

Я хочу решить наименьших квадратов, как система A^t * A * x = -A^t * x. (Я реализую метод Гаусса-Ньютона для специальной задачи).

Я написал специальные процедуры, которые позволяют мне вычислять A * x и A^t * y продукты. С такими процедурами легко использовать решатели без матрицы, благодаря Eigen.

Но мой подход сходится не так хорошо, как Eigen::LeastSquaresConjugateGradient. Я сделал небольшой тест, и похоже, что LeastSquareDiagonalPreconditioner ускоряет конвергенцию.

Мой вопрос - как я могу использовать LeastSquareDiagonalPreconditioner или реализовать собственный Preconditioner, если я могу только вычислять матричные продукты? Я не очень хорошо разбираюсь в предварительных условиях / сопряженных градиентах.

EDIT

Для ясности - я хочу использовать решатели без матрицы от Eigen с моими процедурами продукта.

РЕДАКТИРОВАТЬ 2

Матрично-векторные произведения были получены с использованием автодифференциала в прямом и обратном режимах для некоторых целевых функций.

1 Ответ

0 голосов
/ 08 ноября 2018

Самым простым может быть реализация собственного класса предобусловливателя, наследующего DiagonalPreconditioner и реализующего что-то вроде LeastSquareDiagonalPreconditioner ::factorize(), но адаптированного к вашему типу. В основном вам нужно вычислить:

 m_invdiag(j) = 1./mat.col(j).squaredNorm();

для всех столбцов j, используя стратегию к тому, что вы уже реализовали для операторов продукта.

...