Info
이 질문은 마감되었습니다. 편집하거나 답변을 올리려면 질문을 다시 여십시오.
Variable not advancing as told to
조회 수: 1 (최근 30일)
이전 댓글 표시
I'm attempting to create MATLAB code that transforms any matrix into its row reduced echelon form and logs the steps to LaTeX.
This is what I've done so far (just the steps to row echelon form):
function[lA] = rrefLaTeX(A)
%set initial parameters (j= index of leftmost non-zero column)
disp(A)
[m,n]=size(A);
i=1
j=find(any(A),1)
%if A(i,j)=0, switch row 1 with row k, where k is the index of the first row with a non-zero element in column j
while i<m
if ((A(i,j) == 0))
k = find(A(:,j),1);
A([j,k],:)=A([k,j],:);
disp('\overleftrightarrow{{l_j}\leftrightarrow{l_k}}')
disp(A)
end
%make all elements below the pivot of row i equal 0
for p = (i+1): m
if logical(A(p,j)==0)==0
A(p,:)=A(p,:)-(A(p,j)/A(i,j))*A(i,:);
disp('\overleftrightarrow{{l_p}\gets{l_p-((A(p,j)/A(i,j))l_i}}')
disp(A)
end
end
i=i+1
j=find(any(A([i:end],:)),1)
end
end
This is what I obtain when I run it (with a random matrix A):
if true
>> rrefLaTeX(A)
3 -2 -5 -1
-1 1 5 4
4 -2 5 -2
-5 0 -2 3
i = 1
j = 1
\overleftrightarrow{{l_p}\gets{l_p-((A(p,j)/A(i,j))l_i}}
3 -2 -5 -1
0 1/3 10/3 11/3
4 -2 5 -2
-5 0 -2 3
\overleftrightarrow{{l_p}\gets{l_p-((A(p,j)/A(i,j))l_i}}
3 -2 -5 -1
0 1/3 10/3 11/3
0 2/3 35/3 -2/3
-5 0 -2 3
\overleftrightarrow{{l_p}\gets{l_p-((A(p,j)/A(i,j))l_i}}
3 -2 -5 -1
0 1/3 10/3 11/3
0 2/3 35/3 -2/3
0 -10/3 -31/3 4/3
i = 2
j = 2
\overleftrightarrow{{l_p}\gets{l_p-((A(p,j)/A(i,j))l_i}}
3 -2 -5 -1
0 1/3 10/3 11/3
0 0 5 -8
0 -10/3 -31/3 4/3
\overleftrightarrow{{l_p}\gets{l_p-((A(p,j)/A(i,j))l_i}}
3 -2 -5 -1
0 1/3 10/3 11/3
0 0 5 -8
0 0 23 38
i = 3
j = 2
\overleftrightarrow{{l_j}\leftrightarrow{l_k}}
0 1/3 10/3 11/3
3 -2 -5 -1
0 0 5 -8
0 0 23 38
warning: division by zero
warning: called from
rrefLaTeX at line 20 column 11
\overleftrightarrow{{l_p}\gets{l_p-((A(p,j)/A(i,j))l_i}}
0 1/3 10/3 11/3
3 -2 -5 -1
0 0 5 -8
0/0 0/0 1/0 1/0
i = 4
j = 1
end
The problem is that, when i changes to 3, j should change to 3 as well but it's not happening, making it all fail afterwards. Can someone explain what is going on?
댓글 수: 0
답변 (1개)
dpb
2016년 8월 29일
"...when i changes to 3, j should change to 3 as well but it's not happening"
Looks like perfect place to use debugger to see where your logic error lies...set a breakpoint and trace operation.
The only thing that modifies j is
i=i+1
j=find(any(A([i:end],:)),1)
so the logic flaw has to be in this result; the condition you think is so isn't--the first element of the next row isn't zero; is it possible it isn't quite zero but small enough that disp shows it as such?
Since you make modifications to A by
A(p,:)=A(p,:)-(A(p,j)/A(i,j))*A(i,:);
it's quite possible I'd think that floating point roundoff is biting you (in fact, I'd say it's probable).
댓글 수: 4
dpb
2016년 8월 31일
Use the debugger to see where the logic error is...it's often the case when you actually step thru the code there's a real "AHA!" moment as one realizes what happened...
Did you confirm the issue about floating point rounding was really an issue; you never mentioned on that point...
이 질문은 마감되었습니다.
참고 항목
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!