首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在一行梯队中交换行

在一行梯队中交换行
EN

Stack Overflow用户
提问于 2016-09-25 21:12:48
回答 2查看 743关注 0票数 0

我试图制作一个程序来计算,给定任何矩阵A,它的梯级形式。这是我的代码:

代码语言:javascript
复制
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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-09-26 05:27:14

首先,使用while循环进行j比较简单,因为j不一定在每次迭代中都在增长。主导系数不一定位于主对角线上;当前导0以下的所有元素为零时,主导系数位置向右移动。

其次,在A(j,:)/A(j,j)前应检查主导系数(以防止被0除以)。

第三,在A([i j],:)= A([j i],:)交换Ai第四行和j第四行时,不需要临时交换行。

这是我的myrref版本

代码语言:javascript
复制
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
票数 2
EN

Stack Overflow用户

发布于 2016-09-26 02:21:03

正如打击乐说你需要完成循环一样,你的枢轴也应该只转到m-1

编辑:根据@AVK的评论添加了一个初始支点

代码语言:javascript
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39691905

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档