[英]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.