声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 9100|回复: 15

[综合讨论] 如何用find找出矩阵中完全相同的行

[复制链接]
发表于 2010-3-12 19:44 | 显示全部楼层 |阅读模式

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

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

x
矩阵如下,请问各位,如何利用find找出相同的行?

-1 -1 -1
-1 -1 -1
-1 -1 -1
-1 -1 -1
-1 0 -1
-1 0 -1
-1 0 -1
-1 0 -1
回复
分享到:

使用道具 举报

发表于 2010-3-15 22:01 | 显示全部楼层

回复 楼主 supersonics 的帖子

用find好像比较麻烦啊
矩阵里面是否只有0和1这两个数??
如果是的话
可以对每行用all函数来判断该行是不是全部为1或者为0
发表于 2010-3-16 06:39 | 显示全部楼层
利用ismember函数编个程序,可以解决这个问题:
  1. function y=findsamerow(x)
  2. [m,n]=size(x);
  3. j=1:m;
  4. y=[];
  5. while 1
  6.     if sum(j)==0
  7.         break;
  8.     else
  9.        x0=x(j(find(j~=0,1,'first')),:);
  10.        ind=find(ismember(x,x0,'rows')==1);% 记录行相同的序号
  11.        y=[y,0,ind']; % 用0隔开相同的行,即两个0之间有多个非零,即表示这些行是一样的
  12.        j(ind)=0;     % 若零之间只有一个非零,则表示没有其他行与此行相同
  13.    end
  14. end
复制代码
一些结果:
>> a=[1,2,3;  4,5,6;  7,8,9];
>> findsamerow(a)

ans =

     0     1     0     2     0     3

>> a=[1,2,3;  4,5,6;  1,2,3];;
>>findsamerow(a)

ans =

     0     1     3     0     2

>> a=[1,2,3;  1,2,3;  1,2,3;  4,5,6;  1,2,3;  4,5,6];
>> findsamerow(a)

ans =

     0     1     2     3     5     0     4     6

[ 本帖最后由 ChaChing 于 2010-3-17 09:17 编辑 ]

评分

1

查看全部评分

发表于 2010-3-16 20:26 | 显示全部楼层
原帖由 friendchj 于 2010-3-16 06:39 发表
利用ismember函数编个程序,可以解决这个问题:function y=findsamerow(x)
[m,n]=size(x);
j=1:m;
y=[];
while 1
    if sum(j)==0
        break;
    else
       x0=x(j(find(j~=0,1,'first')),:);
     ...

请问friendchj,在函数findsamerow中第五行‘while 1’是什么意思?
发表于 2010-3-16 21:26 | 显示全部楼层

回复 地板 com007 的帖子

friendchj这帖还未细看!
while 1表示永久回圈, 当sum(j)==0时, break出来
发表于 2010-3-16 22:07 | 显示全部楼层
a=[-1 -1 -1;-1 -1 -1;-1 -1 -1;-1 -1 -1;-1 0 -1;-1 0 -1;-1 0 -1;-1 0 -1];
b=[];
for i=1:8
    if a(i,:)==a(1,:)%%找出跟第一行相等的行
       b=[b;1];
     else  b=[b;0];
     end
end
ndi=find(b==1)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
最后b里面为1的表示两行相等,0则不然。。。
希望能对你有帮助!

[ 本帖最后由 niuniu3 于 2010-3-16 22:10 编辑 ]

评分

1

查看全部评分

发表于 2010-3-17 00:28 | 显示全部楼层
原帖由 niuniu3 于 2010-3-16 22:07 发表
a=[-1 -1 -1;-1 -1 -1;-1 -1 -1;-1 -1 -1;-1 0 -1;-1 0 -1;-1 0 -1;-1 0 -1];
b=[];
for i=1:8
    if a(i,:)==a(1,:)%%找出跟第一行相等的行
...

请问你的程序跟friendchj的有什么不同?

[ 本帖最后由 ChaChing 于 2010-3-17 19:55 编辑 ]
发表于 2010-3-17 00:29 | 显示全部楼层
原帖由 ChaChing 于 2010-3-16 21:26 发表
friendchj这帖还未细看!
while 1表示永久回圈, 当sum(j)==0时, break出来

哦,谢谢你
那请问friendchj的程序适用于大矩阵吗?比如6000*300的矩阵
发表于 2010-3-17 02:25 | 显示全部楼层
像这种循环结构并且y没有预先分配内存,大矩阵跑起来应该比较慢
发表于 2010-3-17 09:39 | 显示全部楼层

回复 7楼 com007 的帖子

6F的仅能找出跟第一行相等的行!
发表于 2010-3-17 11:22 | 显示全部楼层
那如果我想找到6000*100中的重复的两行呢?应该怎么改程序?请问
发表于 2010-3-17 19:31 | 显示全部楼层

一种新算法

我想到一种新算法,但是可能有复杂度有点大:
function SearchSameRow(Inp_Matrix)
[m,n] = size(Inp_Matrix);
fid = fopen('SameRow.txt','wt');
for i = 1 : m-1
    R1 = Inp_Matrix(i,:);
    for j = i+1 : m
        R2 = Inp_Matrix(j,:);
        if R1 == R2
            fprintf(fid,'%d %d\n',i,j);
        end
    end
end
fclose(fid); %结果包含在文件中,自己再去掉重复的



-------------------------------
我试了一下几千的矩阵也要不了10分钟,希望达人改进一下,提出更好的方法

评分

1

查看全部评分

发表于 2010-3-17 20:23 | 显示全部楼层
有I/O会比较快吗!? 晚些有空再试试!
发表于 2010-3-18 00:01 | 显示全部楼层
原帖由 ChaChing 于 2010-3-17 20:23 发表
有I/O会比较快吗!? 晚些有空再试试!

感觉是因为没有用find函数,就快了点,但是不知道怎么改成最简算法?
发表于 2010-3-18 00:06 | 显示全部楼层
刚试下, 的确LS较快些, 如同9F所说大矩阵可能需修饰下
应该与有没find函数无关, 不过没试不确定!

>> aa=rand(6000,300);
>> aa(500:2:510,:)=aa(100:2:110,:);
>> tic; y=findsamerow(aa);toc
Elapsed time is 2597.060208 seconds.
>> tic; SearchSameRow(aa);toc
Elapsed time is 110.256189 seconds.

[ 本帖最后由 ChaChing 于 2010-3-18 00:09 编辑 ]
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

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

GMT+8, 2024-11-13 19:38 , Processed in 0.084879 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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