声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 2324|回复: 6

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

[复制链接]
发表于 2006-10-9 10:48 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
前面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 编辑 ]
回复
分享到:

使用道具 举报

 楼主| 发表于 2006-10-9 10:54 | 显示全部楼层
因为要解决问题的矩阵很大,
像a(3,:)=[];这样的方法不适用
发表于 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,:)=[];

评分

1

查看全部评分

 楼主| 发表于 2006-10-9 11:13 | 显示全部楼层
thanks
发表于 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 编辑 ]
发表于 2006-10-17 00:07 | 显示全部楼层
这句b = logical(sum(a.^2,2) == 0);
可换为any(a,2);
可简单

评分

1

查看全部评分

发表于 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
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-11-12 16:59 , Processed in 0.061069 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表