2016-12-14 15 views
4

lu(A)をMATLABに実装すると、L*Uが直接Aになり、実際のL行列も得られますか?MATLABでピボットを使わないでLU分解を実行

[L,U] = lu(A)を使用すると、MATLABは私に正しいL行列を与えません。私は[L,U,P] = LU(A)を使用すると、私はP*A = L*Uを実装する必要がありますが、私は唯一のA.を受信するL*Uを掛けたい

+0

したがって、行列を入力し、その行列の積が2つの行列を返すようにしたいですか? Aだけを知っていれば、LとUを返そうとします、ここでLxU = Aですか? Lを作ることができるLとUの組み合わせが複数存在するので、明確な答えはありません。 – AndyW

+0

私は実際の下三角行列とL * U = Aを与える方法でlu(A)を実装したいと思います。 – zer0kai

+1

"私はL * Uを掛けてAを受け取るだけです。"しかし 'lu()'はこれを行います。 'L'は置換された下三角です。 – TroyHaskin

答えて

7

MATLABのluは常にデフォルトでピボット行います。たとえば、従来のLU分解アルゴリズムを実行しようとしたときに0に等しい対角係数があった場合、上三角行列Uを作成するためにガウス消去を実行するときに対角係数が必要になるため、機能しませんゼロで除算するエラー。分解が安定していることを確認するには、ピボットが必要です。

ただし、行列の対角係数がゼロでないことが保証されていれば、それは非常に簡単ですが、これはあなた自身で書く必要があります。あなたがしなければならないのは、マトリックス上のガウス消去を実行し、マトリックスを減少したエシェロン形式に減らすことだけです。その結果減じられたエシェロン形式行列はUであるが、ガウス消去におけるLの下三角部分を除去するために必要な係数は、下三角半分に配置されてUとなる。

あなたの行列がAに格納されていると仮定すると、このようなことが起こる可能性があります。私はここで正方行列を仮定していることに注意してください。非ピボットLU分解アルゴリズムの実装は、MATLAB関数ファイルに配置されlu_nopivotと呼ばれる:実行している例として

function [L, U] = lu_nopivot(A) 

n = size(A, 1); % Obtain number of rows (should equal number of columns) 
L = eye(n); % Start L off as identity and populate the lower triangular half slowly 
for k = 1 : n 
    % For each row k, access columns from k+1 to the end and divide by 
    % the diagonal coefficient at A(k ,k) 
    L(k + 1 : n, k) = A(k + 1 : n, k)/A(k, k); 

    % For each row k+1 to the end, perform Gaussian elimination 
    % In the end, A will contain U 
    for l = k + 1 : n 
     A(l, :) = A(l, :) - L(l, k) * A(k, :); 
    end 
end 
U = A; 

end 

、我々は以下の3×3の行列があるとします。

>> rng(123) 
>> A = randi(10, 3, 3) 

A = 

    7  6 10 
    3  8  7 
    3  5  5 

ランニングこのアルゴリズムは、私たちを与える:一緒にLUを掛ける

>> [L,U] = lu_nopivot(A) 

L = 

    1.0000   0   0 
    0.4286 1.0000   0 
    0.4286 0.4474 1.0000 

U = 

    7.0000 6.0000 10.0000 
     0 5.4286 2.7143 
     0   0 -0.5000 

が得られます。

>> L*U 

ans = 

    7  6 10 
    3  8  7 
    3  5  5 

...元の行列Aです。

+0

ありがとう、私はすでにこれを私自身で書いていますが、これはlu(A)でも何らかの形で可能ではありませんか? – zer0kai

+0

@ zer0kaiいいえありません。 MATLABは常に安定性を確保するためにピボットします。たとえば、対角係数が0に等しい場合、アルゴリズムは機能しません。 LU分解が安定していることを確認するには、ピボットが必要です。 – rayryeng

+0

@ zer0kaiしたがって、既にピボットを使わずにLU分解を実行するアルゴリズムを作成していれば、それを使用する必要があります。ピボットを伴わないLU分解は実際上ほとんど見られません。これは、主に技術のアイデアを人々に紹介するために使用され、導入はピボットを導入することによって構築されます。 LUを使用したピボットは、最も頻繁に使用されるものです。 – rayryeng

関連する問題