2016-09-25 3 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]을 얻습니다. 두 번째 행의 첫 번째 열에 0.5을 처리하는 다른 루프를 추가해야합니까? @percusse 당신은 또한 당신의 피벗은 m-1

편집에 가야 루프를 완료 할 필요가 말했다 것처럼

+1

단순히'RREF (A)가'당신이 원하지 않는 무엇? –

+1

네,하지만 실제로 루프를 더 잘 이해할 수있는 프로그램을 작성하고 싶습니다. – ILoveMath

+0

피벗이 0인지 결정하기 전에 열 루프를 마무리해야합니다. 그래서 당신이 교환 할 때 루프의 현재 인덱스 뒤에서 0이 아닌 값이 나오지 않도록하십시오. Row Juggling 대신에 순열 행렬을 곱하면 스왑이 더 쉽습니다. – percusse

답변

2

@의 AVK의 의견에 따라, 그것은 더 간단하다 j이 각 반복마다 반드시 커지는 것은 아니기 때문에 j에 대해 while 루프를 사용하십시오. 선행 계수는 주 대각선에 반드시 위치 할 필요는 없습니다. 선도 0 아래의 모든 요소가 0 일 때 선행 계수 위치가 오른쪽으로 이동합니다.

은 둘째, 선행 계수 전에 점검해야 A(j,:)/A(j,j) (0 의해 분열을 방지하기 위해) 셋째, 임시가 가 Ai 번째 및 j 번째 행 스왑 A([i j],:)= A([j i],:)으로 행을 바꿀 필요가 없다

. 여기

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

: 추가 초기 피벗을 첫째

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