ccchen 发表于 2006-10-9 10:48

[求助]怎样把矩阵中间的某一行删掉呢?

前面happy教授对这个问题给出这样的回答:
a =[ 1 2 3 4
0 0 0 7
2 0 2 9
0 0 0 0];
for i=1:4
if sum(a(i,:).^2)==0
a(i,:)=[];
end
end

这个能理解,

但是如果a的全0项如果不是在最后一项(或者要删除的项不是最后一项),如:
a =[ 1 2 3 4
0 0 0 7
0 0 0 0
2 0 2 9
];
for i=1:4
if sum(a(i,:).^2)==0
a(i,:)=[];
end
end

运行后则会:Index exceeds matrix dimensions.


求教这个问题该怎么解决啊。

谢谢了

[ 本帖最后由 lxq 于 2006-10-9 20:00 编辑 ]

ccchen 发表于 2006-10-9 10:54

因为要解决问题的矩阵很大,
像a(3,:)=[];这样的方法不适用

eight 发表于 2006-10-9 10:57

原帖由 ccchen 于 2006-10-9 10:48 发表
前面happy教授对这个问题给出这样的回答:
a =[ 1 2 3 4
0 0 0 7
2 0 2 9
0 0 0 0];
for i=1:4
if sum(a(i,:).^2)==0
a(i,:)=[];
end
end

这个能理解,

但是如果a的全0项如果不是在最后一项(或者 ...


解决方法应该不少,可以用另外的矩阵把a的非全0行数据记录下来,也可以只记录行索引信息,做完循环后再删除,即:

a =[ 1 2 3 4
    0 0 0 7
    0 0 0 0
    2 0 2 9
    ];
L = size(a,1);
b = false(L,1);
for i=1:L
    if sum(a(i,:).^2)==0
      b(i) = true;
    end
end
a(b,:)=[];

ccchen 发表于 2006-10-9 11:13

thanks

eight 发表于 2006-10-9 21:55

原帖由 eight 于 2006-10-9 10:57 发表



解决方法应该不少,可以用另外的矩阵把a的非全0行数据记录下来,也可以只记录行索引信息,做完循环后再删除,即:

a =[ 1 2 3 4
    0 0 0 7
    0 0 0 0
    2 0 2 9
    ];
L = size(a,1);
b =...


突然想起,其实不必用到循环的(如果矩阵a大小不是太大,应该是不用循环的代码会快,如果很大,自己测试一下两者的速度吧):

a =[ 1 2 3 4
    0 0 0 7
    0 0 0 0
    2 0 2 9
    ];
b = logical(sum(a.^2,2) == 0);
a(b,:)=[];
a

[ 本帖最后由 eight 于 2006-10-9 21:57 编辑 ]

randomatom 发表于 2006-10-17 00:07

这句b = logical(sum(a.^2,2) == 0);
可换为any(a,2);
可简单

eight 发表于 2006-10-17 09:56

原帖由 randomatom 于 2006-10-17 00:07 发表
这句b = logical(sum(a.^2,2) == 0);
可换为any(a,2);
可简单

thanks,当时没有仔细考虑sum的问题,呵呵,结合你的意见修改后如下:

a =[ 1 2 3 4
    0 0 0 7
    0 0 0 0
    2 0 2 9
    ];
b = ~any(a,2);
a(b,:)=[];
a
页: [1]
查看完整版本: [求助]怎样把矩阵中间的某一行删掉呢?