繁体   English   中英

解决Matlab中的稀疏三角线性系统

[英]Solve the sparse triangular linear system in Matlab

我在Matlab中为一些大型稀疏矩阵实现了LU分解算法,以解决线性系统。 当我得到L,U矩阵时,我使用了向后替换和正向替换算法来求解三角线性系统:

    %x = U\y;

for i = n : -1 : 1
    x(i,:) = (y(i,:)-U(i,:)*x)/U(i,i);
end

但是我发现这段代码是瓶颈。 尽管我可以使用A \\ b来获得解决方案,但是我想知道如何在Matlab中实现一种有效的算法来解决此问题,例如,我可以编写矩阵乘积来模拟以下动作而无需for循环吗?

(我有一些参考书和论文,但是所有代码都不在Matlab中,仅适用于C ++或C代码)

首先, 正确性要高于速度 您发布的循环产生的结果不同于 U\\y ,因此您可能要先检查一下:)

AFAIK,反斜杠会对输入矩阵进行一些检查,并相应地调用最快的算法。 当这些检查表明A为较低的三角形时,它将完全按照您的操作进行操作(但可能会更有效)。

无论如何,为了加快代码速度:您应该预先分配x ,否则Matlab将在每次迭代时强制增大向量。 另外,将循环变量ii称为i是虚数单位,每次迭代的名称解析都需要一些时间。 因此,总而言之:

x = zeros(size(y));
for ii = n : -1 : 1
    x(ii,:) = (y(ii,:)-U(ii,:)*x)/U(ii,ii);
end

请注意,没有“矢量化”解决方案,因为下一个结果取决于上一个结果。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM