2015-11-11 77 views
2

Matlab中有幾種方法可以計算「LU分解」。這裏是一個:使用較少的循環進行LU分解

function [L,A]=LU_factor(A,n)  
L=eye(n); 
for k=1:n 
    if (A(k,k) == 0) Error('Pivoting is needed!'); end 
    L(k+1:n,k)=A(k+1:n,k)/A(k,k); 
    for j=k+1:n 
     A(j,:)=A(j,:)-L(j,k)*A(k,:); 
    end 
end 

但我的老師告訴我們,在MATLAB使用for可以降低程序的效率。他告訴我們使用更少的for s來計算LU分解。他說,你可以在不使用for的情況下找到所需的索引,然後根據一些技巧,根本不需要使用for

我的第一個問題是:會不會使用for真的降低程序的速度?我的第二個問題是:如何將所需的索引存儲在數組中並使用它們代替for循環?

+1

有一個函數[魯](http://uk.mathworks.com/help/matlab/ ref/lu.html)這可能是在matlab中進行分解的最有效的方法:) – nivag

+0

'for'循環在MATLAB中過去效率非常低,並且因爲這個原因,有很多遺留的厭惡。這些日子,他們實際上是更有效率(感謝JIT編譯器)提供您預先分配您的矩陣。有時循環甚至可以超越矢量化解決方案。但通常他們還是比較慢。唯一真正知道的方法是使用像'timeit'這樣的函數來自己寫出和計算它們。 – Dan

+0

我認爲這裏的for循環非常好。 執行lu分解的快速方法是'lu'命令,並且無法在MATLAB代碼中更快地寫入內容。 編寫自己的'lu'函數的速度無法達到速度。這一點必須是建立概念理解和實踐。在MATLAB以外的編碼中,for循環非常好。模糊的,複雜的代碼來避免循環只是MATLAB特有的怪異,它不是一些普遍的技巧。 –

回答

2

有兩種方法可以刪除內部循環。

如果你的老師碰巧是一個bsxfun-lover -

A(k+1:n,:) = A(k+1:n,:) - bsxfun(@times,L(k+1:n,k),A(k,:)) 

否則,

A(k+1:n,:) = A(k+1:n,:) - L(k+1:n,k)*A(k,:) 
+0

如果你不創建並返回'L',它不是真正的** L ** U分解。你可能只想堅持'A(k + 1:n,:) = A(k + 1:n,:) - L(k + 1:n,k)* A(k,:)'內部循環。此外'bsxfun'在這裏有點不必要,如果這是他的老師的意思,我會非常驚訝。 – IKavanagh

+0

@IKavanagh啊,是的,你是對的。加回'L'部分。 – Divakar