我试图制作一个程序来计算,给定任何矩阵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?
发布于 2016-09-26 05:27:14
首先,使用while循环进行j比较简单,因为j不一定在每次迭代中都在增长。主导系数不一定位于主对角线上;当前导0以下的所有元素为零时,主导系数位置向右移动。
其次,在A(j,:)/A(j,j)前应检查主导系数(以防止被0除以)。
第三,在A([i j],:)= A([j i],:)交换A的i第四行和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发布于 2016-09-26 02:21:03
正如打击乐说你需要完成循环一样,你的枢轴也应该只转到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
endhttps://stackoverflow.com/questions/39691905
复制相似问题