2016-09-25 6 views
0

私は、任意の行列A、そのエシェロン形式を計算するプログラムを作成しようとしています。ここに私のコードは次のとおりです。行エシェロンの行をスワップ

function A = myrref(A) 

[m,n]=size(A); 

for j=1:min(m,n)  
    A(j,:) = A(j,:)/A(j,j); 
    for i = j+1:m 
     A(i,:)= A(i,:)- A(j,:)*A(i,j); 
     if A(i,i) == 0 
      row1=A(i,:); 
      A(i,:)=A(i+1,:); 
      A(i+1,:)=row1; 
     end 
    end 
end 

ほとんど正常に動作するようですが、行を交換するとき、私はまだ問題を抱えています。たとえば、行列のエシェロン形式を取得しようとするとA=[1 1 1; 2 2 1; 1 2 2]、私は[1 1 1; 0.5 1 1; 0 0 -1]私は欲しいものではありません取得します。 2列目の最初の列に0.5を処理する別のループを追加する必要がありますか?

+1

は単に 'RREF(A)'あなたが望んでいないとは何ですか? –

+1

はい、実際にループを理解するためのプログラムを書いています。 – ILoveMath

+0

ピボットがゼロであるかどうかを判断する前に、列ループを終了する必要があります。そのため、スワップするときに、ループの現在のインデックスの後ろに0以外の値がないようにします。列ジャグリングの代わりに置換行列を掛けるだけでスワップが簡単になります – percusse

答えて

2

に基づいて、初期のピボットを追加しました、それはsimplierですjが必ずしも各反復で成長するわけではないので、ループをjに使用してください。先頭の係数は、必ずしも主対角線上に位置する必要はない。先頭の0の下の要素がすべて0の場合、先頭の係数位置は右にシフトします。

第二に、先頭の係数は( 0による除算を防ぐために) A(j,:)/A(j,j)前にチェックされるべきである

第三に、一時的にA([i j],:)= A([j i],:)Ai番目とj番目の行をスワップとしての行を交換する必要はありません。ここで

myrrefの私のバージョンです:

function A = myrref(A) 
[m,n]=size(A); 
j= 1; % the row index of the leading coefficient position 
k= 1; % the column index of the leading coefficient position 
while j<m && k<=n 
    if A(j,k)==0 % we need to change the row order 
     zeroindex= find(A(j+1:end,k)~=0); % find nonzero elements below A(j,k) 
     if isempty(zeroindex) 
      k= k+1; % there is no such elements; shift to the right 
     else 
       % swap the rows 
      A([j zeroindex(1)+j],:)= A([zeroindex(1)+j j],:); 
     end 
    else 
     A(j,:) = A(j,:)/A(j,k); 
     for i= j+1:m 
      A(i,:)= A(i,:)- A(j,:)*A(i,k); 
     end 
     j= j+1; k= k+1; 
    end  
end 
1

@percusseはまた、あなたのピボットのみm-1

編集に行くべきループを終了する必要があると述べたのと同じように:@のAVKさんのコメントまず

function A = myrref(A) 
[m,n]=size(A); 

for i = 1:m-1 
    if A(i,i) == 0 
     row1=A(i,:); 
     A(i,:)=A(i+1,:); 
     A(i+1,:)=row1; 
    end 
end 

for j=1:min(m,n) 
    A(j,:) = A(j,:)/A(j,j); 
    for i = j+1:m 
     A(i,:)= A(i,:)- A(j,:)*A(i,j); 
    end 

    for i = j+1:m-1 
     if A(i,i) == 0 
      row1=A(i,:); 
      A(i,:)=A(i+1,:); 
      A(i+1,:)=row1; 
     end 
    end 
end 
+0

'a(1,1)'が '0'の場合、このコードは失敗します。 – AVK

関連する問題