Решить * разреженная * верхняя треугольная система

Если я хочу решить полное верхняя треугольная система, я могу назвать 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.


вы можете использовать операторы MLDIVIDE( \ ) или MRDIVIDE( / ) для разреженных матриц...