2015-09-20 78 views
0

所以我對Matlab很新,我一直負責實現LU分解。我必須遞歸執行它,因爲我們不允許在代碼中使用for循環,並且遞歸會給我們帶來最佳標記。我寫了這段代碼。該代碼適用於第一步,並做它應該做的,但對於接下來的兩個步驟,矩陣根本不會被修改。我有這樣的代碼:在Matlab中遞歸。爲什麼我的遞歸不能通過第一步?

function[L, U] = myLU(A,B, pos) 
%A = Mtrix that becomes U 
%B = Matrix that becomes L 
    tmp_L = B; 
    [x,y] = size(A); 
    if pos > x 
     L = B; 
     U = A; 
     return 
    else 
     pos %<-- just to see if it iterates through everything 
     [tmp_U,tmp_L] = elimMat(A,pos); 
     myLU(tmp_U,tmp_L, pos+1); 
    end 
    L = tmp_L; 
    U = tmp_U; 
end 

其中elimMat(A, pos)返回列pos的消元矩陣。以及另一個矩陣,最終將成爲乘數矩陣。我試着做的是找到矩陣A的LU分解。因爲elimMat返回L和U(這是有效的,如果我手動執行它),我必須創建一個函數,允許我自動執行而不使用for循環。我以爲我會遞歸地做。我最終做的是將另一個變量B添加到函數中,以便我可以存儲在每個步驟中獲得的矩陣的中間值,並在稍後將它們放在一起。

所以這是我的問題。我執行遞歸錯了嗎?如果我是我如何解決它?我想問的另一件事是我如何實現這一點,所以我不需要變量B作爲額外的輸入,只使用現有的變量或先前定義的變量來找到解決方案?我真的很喜歡我的函數只有兩個輸入:矩陣名稱和起始索引。

這裏是elimMat如果要是幫助:

function [M,L] = elimMat(A,k) 
    %find the size of the matrix 
    [x,y] = size(A); 
    tmp_mat = zeros(x,y); 
    %M = The current matrix we are working on for Elimination -> going to 
    %become U. 
    %L = The L part of the matrix we are working on. Contains all the 
    %multipliers. This is going to be our L matrix. 
    for i = 1:x 
     mult = A(i,k)/A(k,k); 
     if i > k    
      tmp_mat(i,k) = mult; 
      P = A(k,:)*mult; 
      A(i,:) = A(i,:)-P; 
     elseif i == k 
      tmp_mat(k,k) = 1; 
     end 
    end 
    M = A; 
    L = tmp_mat; 
end 

感謝您能提供任何反饋。

這裏是輸出:是我所得到VS它應該是什麼:

[U =     VS   [U = 

1  2  2      1 2 2 
0 -4 -6      0 -4 -6 
0 -2 -4]      0 0 2 

L =       VS  [L= 

1  0  0      1 0 0 
4  0  0      4 1 0 
4  0  0]      4 0.5 1 

正如你所看到的只是第一列改變

+1

關於你的第一個代碼塊:如果你使用基於縮進的代碼格式,你不需要寫反引號。雖然在SO中沒有正確的matlab語法高亮,但你的第一個塊更加糟糕:)而且'elimMat'開頭的註釋可能會讓人困惑:函數頭部後面的第一個連續註釋行是它的幫助。如果你輸入'help elimMat',你應該看到代碼的第一個註釋。爲了避免這種情況,在函數頭後面留下一個空行(至少我認爲應該修復它,或者在頭後面加一個空註釋)。 –

+0

感謝您的反饋。我會盡快讓我的代碼正常工作。 –

回答

2

你忘了抓住你的遞歸調用的輸出:

[tmp_L, tmp_U] = myLU(tmp_U,tmp_L, pos+1); 

Matlab的由值傳遞的變量,所以函數不能改變其輸入變量本身(OK,它可以,但它的棘手和不安全的)。

您的原始版本沒有返回更新後的矩陣,那麼最外面的函數調用中遇到的myLU()通話,讓遞歸展開和完成,然後繼續使用tmp_Ltmp_U從最初的調用返回的elimMAT(A,1)

請注意,您可能需要標準化您的功能,以便它們以相同的順序返回UL以避免混淆。

+0

謝謝你的回答。我不相信我忽視了結果分配。這工作的第一部分。和U出來正確。但是我仍然遇到L問題。你有什麼想法如何解決我有的其他問題?我想從功能調用中刪除tmp_L並仍然讓我回到L? –

+0

等待nvm。我只是沒有通過它的功能。這將解釋爲什麼它不工作。 –

+0

@ MD-4我不完全明白問題所在,但你的第二個表揚告訴我,根本沒有問題。讓我知道如果還有東西:) –