我试图制作一个程序,根据任何矩阵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
?
答案 0 :(得分:2)
首先,对while
使用j
循环更为简单,因为j
不一定会在每次迭代中增长。领先系数不一定位于主对角线上;当前导0
下方的所有元素都为零时,前导系数位置向右移动。
其次,应在A(j,:)/A(j,j)
之前检查领先系数(以防止除以0
)
第三,不需要临时将行换成A([i j],:)= A([j i],:)
交换i
的{{1}}和j
行。
这是我的A
版本:
myrref
答案 1 :(得分: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