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