交替排行梯队

时间:2016-09-25 21:12:49

标签: matlab

我试图制作一个程序,根据任何矩阵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

2 个答案:

答案 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