解决*稀疏*上三角系统

时间:2012-10-07 00:53:11

标签: matlab linear-algebra sparse-matrix triangular

如果我想解决一个完整的上三角系统,我可以调用linsolve(A,b,'UT')。但是稀疏矩阵目前不支持此功能。我怎么能克服这个?

3 个答案:

答案 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_lsolvecs_utsolvecs_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(/)运算符......