如果我想解决一个完整的上三角系统,我可以调用linsolve(A,b,'UT')
。但是稀疏矩阵目前不支持此功能。我怎么能克服这个?
答案 0 :(得分:4)
UT和LT系统是最容易解决的系统之一。请阅读on the 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
np已经表明,它也适用于备件矩阵。
请注意,此运算符还可以解决具有非正方形A
的UT系统,或者如果A
在主对角线上具有等于零(或< eps
)的某些元素。它以最小二乘意义解决了这些情况,这对您来说可能是也可能不是。在执行求解之前,您可以检查这些案例:
if size(A,1)==size(A,2) && all(abs(diag(A)) > eps)
x = A\b;
else
%# error, warning, whatever you want
end
通过键入
了解有关(反向)斜杠运算符的更多信息>> help \
或
>> help slash
在Matlab命令提示符上。
答案 1 :(得分:3)
编辑由于您需要的是三角形求解过程,也称为向后/向前替换,您可以使用普通的MATLAB反斜杠\
运算符:
x = U\b
正如原始答案中所提到的,MATLAB将认识到矩阵是三角形的。为确保这一点,您可以将效果与SuiteSparse中的cs_usolve
程序进行比较。它是一个用C实现的mex函数,用于计算上三角稀疏矩阵的稀疏三角形求解(也有相似的函数:cs_lsolve
,cs_utsolve
和cs_ltsolve
)。
在稀疏Cholesky分解的上下文中,您可以查看performance comparison本机MATLAB和cs_l(t)solve
。从本质上讲,MATLAB的性能很好。唯一的缺陷是如果你想解决一个转置系统
x = U'\b
MATLAB 不识别并明确创建U
的转置。在这种情况下,您应该明确地致电cs_utsolve
。
原始答案如果您的系统是对称的,并且您只存储上三角矩阵部分(这就是我在您的问题中理解完整的方式),并且如果Cholesky分解是适合你,chol处理对称矩阵,如果你的矩阵是正定的。对于无限矩阵,您可以使用ldl。两者都处理稀疏存储并处理对称矩阵部分。
较新的matlab版本使用cholmod and suitesparse。这是迄今为止我所知道的表现最佳的Cholesky分解。在matlab中,它也可以并行使用并行BALS。
从上述函数中获得的因子是上三角矩阵L,使得
A=LL'
现在你需要做的就是执行前向和后向替换,这很简单又便宜。在matlab中,这是在反斜杠操作符
中自动完成的x=L'\(L\b)
矩阵可以是稀疏的,matlab会识别它是上/下三角形。您还可以将此调用与使用cholesky分解所获得的因子的前向替换一起使用。
答案 2 :(得分:1)
你可以在稀疏矩阵上使用MLDIVIDE(\)或MRDIVIDE(/)运算符......