在Matlab中求解稀疏三角形线性系统

时间:2012-11-16 06:37:09

标签: matlab matrix linear-algebra sparse-matrix numerical-methods

我在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代码)

1 个答案:

答案 0 :(得分:3)

首先关闭:正确性速度之前;你发布的循环会从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

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