Решить * разреженная * верхняя треугольная система
Если я хочу решить полное верхняя треугольная система, я могу назвать linsolve(A,b,'UT')
. Однако в настоящее время не поддерживается для разреженных матриц. Как я могу преодолеть это?
3 ответов
редактировать поскольку вам нужна треугольная процедура решения, также называемая обратной / прямой заменой, вы можете использовать обычную обратную косую черту MATLAB \
оператора для этого:
x = U\b
как упоминалось в исходном ответе, MATLAB распознает тот факт, что ваша матрица треугольная. Чтобы быть уверенным в этом, вы можете сравнить производительность с cs_usolve
порядок в SuiteSparse. Это функция mex, реализованная в C, которая вычисляет разреженный треугольное решение для верхнетреугольной разреженной матрицы (там тоже есть похожие функции:cs_lsolve
, cs_utsolve
и cs_ltsolve
).
вы можете посмотреть сравнение производительности родной MATLAB и cs_l(t)solve
в условиях разреженной матрицы факторизации. По сути, производительность MATLAB хорошая. Единственная ловушка, если вы хотите решить транспонированную систему
x = U'\b
MATLAB делает не признать это и явно создает транспонировать U
. В этом случае вы должны позвонить cs_utsolve
явно.
оригинальный ответ если ваша система симметрична, и вы храните только верхнюю треугольную часть Матрицы (вот как я понял полное в вашем вопросе), и если разложение Cholesky подходит для вас,chol обрабатывает симметричные матрицы, если ваша матрица положительно определена. Для неопределенных матриц вы можете использовать ЛНП. Обе ручки разреженные хранение и работа над симметричными матричными частями.
новые версии matlab используют cholmod и suitesparse для этого. Это однозначно лучшее исполнение холеского я знаю. В matlab также распараллеливается usin parallel BALS.
коэффициент, который вы получаете от вышеуказанных функций, является верхней треугольной матрицей L такой, что
A=LL'
все, что вам нужно сделать сейчас, это выполнить вперед и назад замену, которая проста и дешева. В matlab это автоматически делается в операторе обратной косой черты
x=L'\(L\b)
матрица может быть разреженной, и matlab распознает, что она является верхней/нижней треугольной. Вы также будете использовать этот вызов вместе с прямой подстановкой для факторов, полученных с помощью факторизации cholesky.
системы UT и LT являются одними из самых простых систем для решения. Прочтите на wiki об этом. Зная это, легко написать свой собственный ut или LT решатель:
%# some example data
A = sparse( triu(rand(100)) );
b = rand(100,1);
%# solve UT system by back substitution
x = zeros(size(b));
for n = size(A,1):-1:1
x(n) = (b(n) - A(n,n+1:end)*x(n+1:end) ) / A(n,n);
end
процедура довольно похожа для систем LT.
сказав это, обычно намного проще и быстрее использовать оператор обратной косой черты Matlab:
x = A\b
который также работает для матриц запасных частей, как уже указывал Нейт.
обратите внимание, что это оператор также разрешает системы UT которые имеют non-квадрат A
или A
есть некоторые элементы, равные нулю (или < eps
) на главной диагонали. Он решает эти случаи в смысле наименьших квадратов, что может быть или не быть желательным для вас. Вы можете проверить эти случаи перед выполнением решения:
if size(A,1)==size(A,2) && all(abs(diag(A)) > eps)
x = A\b;
else
%# error, warning, whatever you want
end
подробнее об операторе (back)slash, набрав
>> help \
или
>> help slash
в командной строке Matlab.