Эффективное решение линейной системы с диагональной матрицей Лапласа +

Дорогие друзья Matlab,

В моей реализации алгоритма обработки изображений мне приходится решать большую линейную систему вида A * x = b, где:

  • matrix A=L+D is the sum of a Laplacian matrix L and a diagonal matrix D
  • Laplacian matrix L is sparse, with about 25 non-zeros per row
  • the system is large, with as many unknowns as there are pixels in the input image (typically > 1 million).

Матрица Лапласа L не меняется между последовательными прогонами алгоритма; Я могу построить эту матрицу при предварительной обработке и, возможно, вычислить ее факторизацию. Диагональная матрица D и правый вектор b изменяются при каждом прогоне алгоритма.

Я пытаюсь выяснить, каким будет самый быстрый метод для решения системы во время выполнения; Я не против тратить время на предварительную обработку (например, для вычисления факторизации L).

Моя первоначальная идея состояла в том, чтобы предварительно вычислить факторизацию Cholesky L, а затем обновить факторизацию во время выполнения со значениями из D (обновление ранга 1 с cholupdate) и быстро решить проблему с обратной подстановкой. К сожалению, факторизация Холецкого не так редка, как исходная матрица L, а просто ее загрузка с диска уже занимает 5.48 с; для сравнения, для решения проблемы с обратной косой чертой требуется 8.30 секунд.

Учитывая форму моих матриц, есть ли какой-либо другой метод, который вы бы рекомендовали ускорить решение во время выполнения, независимо от того, сколько времени потребуется на время предварительной обработки?

Заранее спасибо за вашу помощь!

3
nl ja de
Попробуйте SVD, я не знаю, как быстро это для большого количества данных, хотя ...
добавлено автор Ander Biguri, источник
да, наверное, ты прав, я не эксперт. На всякий случай вы не учли, что :)
добавлено автор Ander Biguri, источник
Взгляните на это: scicomp.stackexchange.com/questions/1001/…
добавлено автор johnish, источник
Я не понимаю, почему применение SVD здесь было бы хорошей идеей, учитывая форму моих матриц.
добавлено автор Asmo, источник

1 ответы

Предполагая, что вы работаете над сеткой (поскольку вы упоминаете изображения - хотя это не гарантируется), вас больше интересует скорость, чем точность (поскольку 5 секунд кажется слишком медленным для 1 миллиона неизвестных), я вижу несколько вариантов.

Во-первых, забудьте о точных методах, таких как Cholesky (+ переупорядочение). Даже если они позволяют хранить факторизацию и повторно использовать ее для нескольких rhs, вам, скорее всего, придется хранить гигантские матрицы, которые кажутся неразрешимыми в вашем случае (надеюсь, вы переупорядочиваете строки/столбцы с обратным Cuthill McKee или что-то еще еще, хотя - это значительно упрощает факторизацию).

В зависимости от ваших граничных условий я бы сначала попробовал Matlab poisolv , который решает проблему Пуассона, используя БПФ, и возможные перепрограммы, если вы хотите, чтобы граничные условия Дирихле вместо периодических. Это очень быстро, но, возможно, не подходит для вашей проблемы (вы указываете, что у вас есть 25 nnz для матрицы Laplacian + identity: почему? - это матрица Лапласа высокого порядка, и в этом случае вы можете быть более заинтересованы в точности, чем я предполагаю ? или есть - это на самом деле другая проблема, чем та, которую вы описываете?).

Затем вы можете попробовать многосеточные решатели, которые очень бывают для изображений и гладких проблем. Вы можете использовать простой метод релаксации для каждой итерации и каждого уровня многосеточной программы или использовать более удобные методы (например, предустановленный сопряженный градиентный уровень). В качестве альтернативы вы можете сделать более простой предварительно сконфигурированный сопряженный градиент (или даже SSOR) без мультисерии, и если вас интересует только приблизительное решение, вы можете остановить итерации до полной конвергенции.

Мои аргументы для итеративных решателей:

  • вы можете остановить до конвергенции, если вы хотите приблизительную проблему
  • вы можете повторно использовать другие результаты для инициализации своего решения (например, если ваши разные прогоны соответствуют разным кадрам видео, то использование решения предыдущего кадра в качестве инициализации следующего имеет смысл) .

Конечно, прямой решатель, для которого вы можете прекомпотировать, хранить и сохранять факторизацию, также имеет смысл (хотя я не понимаю ваш аргумент для обновления ранга-1, если ваша матрица постоянна), так как только backsubstitution еще предстоит сделать на во время выполнения. Но при этом игнорируется структура проблемы (регулярная сетка, возможная заинтересованность в ограниченных результатах точности и т. Д.), Я бы выбрал методы, которые были разработаны для таких случаев, таких как фурье-подобные методы или мультириды. Оба метода могут быть реализованы на графическом процессоре для получения более быстрых результатов (напомним, что графические процессоры адаптированы для обработки изображений/текстур!).

Наконец, вы можете получить интересные ответы scicomp.stackexchange , который больше ориентирован на численный анализ.

2
добавлено
спасибо :) У меня сложилось впечатление, что неполные факторизации Холецкого для предварительной подготовки были намного медленнее, чем простой предубедитель Якоби, только для незначительного улучшения скорости конвергенции; не так ли?
добавлено автор WhitAngl, источник
+1 за упоминание о переупорядочении! Я бы просто добавил неполную факторизацию Холецкого в ваш список, в противном случае - отлично!
добавлено автор Dr_Sam, источник