我在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代码)
答案 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
请注意,没有“矢量化”解决方案,因为下一个结果取决于前一个。