簡體   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