求解*稀疏*上三角系统



如果我想求解上三角系统,我可以调用linsolve(A,b,'UT')。然而,目前稀疏矩阵不支持这种方法。我该如何克服这一点?

UT和LT系统是最容易解决的系统之一。在维基上读一读。知道这一点,很容易编写自己的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 = 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_lsolvecs_utsolvecs_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(/)运算符。。。

相关内容

  • 没有找到相关文章

最新更新