В моята реализация на алгоритъм за обработка на изображения, трябва да реша голяма линейна система от формата A*x=b
, където:
- Матрица
A=L+D
е сумата от лапласова матрица L и диагонална матрица D - Лапласианската матрица L е разредена, с около 25 ненули на ред
- Системата е голяма, с толкова неизвестни, колкото има пиксели във входното изображение (обикновено > 1 милион).
Матрицата на Лаплас L не се променя между последователните изпълнения на алгоритъма; Мога да конструирам тази матрица при предварителна обработка и евентуално да изчисля нейното факторизиране. Диагоналната матрица D и десният вектор b се променят при всяко изпълнение на алгоритъма.
Опитвам се да разбера кой би бил най-бързият метод за решаване на системата по време на изпълнение; Нямам нищо против да отделям време за предварителна обработка (за изчисляване на факторизация на L, например).
Първоначалната ми идея беше предварително да изчисля факторизация на Cholesky на L, след това да актуализирам факторизацията по време на изпълнение със стойности от D (ранг-1 актуализация с cholupdate) и да разреша бързо проблема с обратно заместване. За съжаление факторизацията на Cholesky не е толкова рядка като оригиналната L матрица и самото й зареждане от диска вече отнема 5,48 s; за сравнение, отнема 8,30 секунди за директно решаване на системата с обратна наклонена черта.
Като се има предвид формата на моите матрици, има ли друг метод, който бихте препоръчали за ускоряване на решаването по време на изпълнение, без значение колко време отнема при предварителната обработка?