2012-09-02 114 views
1

我想在MatLab中編寫一個算法,該算法以下三角矩陣爲輸入。輸出應該是這個矩陣的倒數(它也應該是下三角形)。我幾乎設法解決這個問題,但我的算法的一部分仍然讓我撓頭。到目前爲止,我有:MatLab - 求矩陣求逆的算法

function AI = inverse(A) 
n = length(A); 
I = eye(n); 
AI = zeros(n); 
for k = 1:n 
    AI(k,k) = (I(k,k) - A(k,1:(k-1))*AI(1:(k-1),k))/A(k,k); 
    for i = k+1:n 
     AI(i,k) = (I(i,k) - (??????????????))/A(i,i); 
    end 
end 

我用問號標記了我不確定的部分。我試圖通過在紙上寫出程序來找到這部分代碼的模式,但我似乎無法找到解決這部分問題的正確方法。

如果有人能幫助我,我會非常感激!

+0

爲什麼你不能只使用inv(A)? – 2012-09-02 20:23:59

+0

@ diophantine:因爲我正在學習算法的細節:)。我上面發佈的問題是我的教科書中給出的練習。當然,我知道我可以使用inv(A),但是學習如何從頭開始構建算法是我正在使用的課程的目標。 – Kristian

回答

3

這裏是我的代碼通過使用行變換得到下三角矩陣的逆:

function AI = inverse(A) 
    len = length(A); 
    I = eye(len); 
    M = [A I]; 
    for row = 1:len 
     M(row,:) = M(row,:)/M(row,row); 
     for idx = 1:row-1 
      M(row,:) = M(row,:) - M(idx,:)*M(row,idx); 
     end 
    end 
    AI = M(:,len+1:end); 
end 
1

你可以在Octave's source上看到它是如何完成的。這似乎根據矩陣的類別在不同的地方實施。對於浮動型角矩陣它在liboctave/array/fDiagMatrix.cc,對於複雜的對角矩陣它在liboctave/array/CDiagMatrix.cc,等...

一個自由的優勢(如自由)軟件是你可以自由學習的東西是如何實現的;)

+0

感謝您的鏈接!我會檢查這一點。 – Kristian

0

感謝所有的輸入!考慮到輸入是一個下三角矩陣,我實際上能夠找到一個非常好的和簡單的方法來解決這個問題:

function AI = inverse(A) 
n = length(A); 
I = eye(n); 
AI = zeros(n); 
for k = 1:n 
    for i = 1:n 
     AI(k,i) = (I(k,i) - A(k,1:(k-1))*AI(1:(k-1),i))/A(k,k); 
    end 
end