如果我想求解全上三角系统,我可以调用linsolve(A,b,'UT')
。然而,目前稀疏矩阵不支持这种方法。我该如何克服这一点?
%# 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 = Ab
它也适用于备用矩阵,正如nate已经指出的那样。
注意,该算子还求解具有非平方A
的UT系统,或者如果A
在主对角线上具有等于零(或< eps
)的一些元素。它在最小二乘的意义上解决了这些情况,这对你来说可能是可取的,也可能不是可取的。在进行解决之前,您可以检查这些情况:
if size(A,1)==size(A,2) && all(abs(diag(A)) > eps)
x = Ab;
else
%# error, warning, whatever you want
end
通过键入了解更多关于(反)斜线运算符的信息
>> help
或
>> help slash
在Matlab命令提示符下。
编辑由于您需要一个三角形求解过程,也称为向后/向前替换,因此可以使用普通的MATLAB反斜杠运算符:
x = Ub
正如原始答案中提到的,MATLAB将认识到矩阵是三角形的事实。可以肯定的是,您可以将性能与SuiteParse中的cs_usolve
过程进行比较。它是一个用C实现的mex函数,用于计算上三角稀疏矩阵的稀疏三角解(那里也有类似的函数:cs_lsolve
、cs_utsolve
和cs_ltsolve
)。
您可以在稀疏Cholesky因子分解的背景下查看原生MATLAB和cs_l(t)solve
的性能比较。从本质上讲,MATLAB的性能是好的。唯一的陷阱是如果你想解决转置系统
x = U'b
MATLAB不认识到这一点,并显式创建了U
的转置。在这种情况下,您应该显式调用cs_utsolve
。
原始答案如果你的系统是对称的,并且你只存储上三角矩阵部分(这就是我在你的问题中理解完整的方式),如果Cholesky分解适合你,chol处理对称矩阵,如果你的矩阵是正定的。对于不定矩阵,可以使用ldl。两者都处理稀疏存储并处理对称矩阵部分。
较新的matlab版本使用cholmod和suitesparse。这是迄今为止我所知道的性能最好的Cholesky因子分解。在matlab中,它也被并行化为BALS。
从上述函数中获得的因子是上三角矩阵L,这样
A=LL'
你现在所需要做的就是向前和向后换人,这既简单又便宜。在matlab中,这是在反斜杠运算符中自动完成的
x=L'(Lb)
矩阵可以是稀疏的,matlab会识别出它是上/下三角的。您还可以将此调用与使用cholesky因子分解获得的因子的前向替换一起使用。
您可以在稀疏矩阵上使用MLDIVIDE(\)或MRDIVIDE(/)运算符。。。