2

下三角行列を入力として取るアルゴリズムを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

不明な部分に疑問符を付けました。手順を紙に書き出すことで、コードのこの部分のパターンを見つけようとしましたが、この部分を解決する適切な方法を見つけることができないようです。

誰かが私を助けることができれば、私はとても感謝しています!

4

3 に答える 3

4

行変換を使用して下三角行列の逆行列を取得するコードを次に示します。

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
于 2012-09-03T01:05:42.760 に答える
2

Octave のソースでその方法を確認できます。これは、マトリックスのクラスに応じてさまざまな場所に実装されているようです。Float 型の対角行列の場合は on liboctave/array/fDiagMatrix.cc、複雑な対角行列の場合は onliboctave/array/CDiagMatrix.ccなど...

フリー (自由) ソフトウェアの利点の 1 つは、物事がどのように実装されているかを自由に研究できることです ;)

于 2012-09-02T20:55:30.427 に答える
1

すべての入力に感謝します! 入力が下三角行列であることを考えると、今日、この問題を解決するための非常に優れた簡単な方法を実際に見つけることができました。

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
于 2012-09-03T21:32:56.093 に答える