supersonics 发表于 2010-3-12 19:44

如何用find找出矩阵中完全相同的行

矩阵如下,请问各位,如何利用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

tuoniao992002 发表于 2010-3-15 22:01

回复 楼主 supersonics 的帖子

用find好像比较麻烦啊
矩阵里面是否只有0和1这两个数??
如果是的话
可以对每行用all函数来判断该行是不是全部为1或者为0

friendchj 发表于 2010-3-16 06:39

利用ismember函数编个程序,可以解决这个问题:function y=findsamerow(x)
=size(x);
j=1:m;
y=[];
while 1
    if sum(j)==0
      break;
    else
       x0=x(j(find(j~=0,1,'first')),:);
       ind=find(ismember(x,x0,'rows')==1);% 记录行相同的序号
       y=; % 用0隔开相同的行,即两个0之间有多个非零,即表示这些行是一样的
       j(ind)=0;   % 若零之间只有一个非零,则表示没有其他行与此行相同
   end
end一些结果:
>> a=;
>> findsamerow(a)

ans =

   0   1   0   2   0   3

>> a=;;
>>findsamerow(a)

ans =

   0   1   3   0   2

>> a=;
>> findsamerow(a)

ans =

   0   1   2   3   5   0   4   6

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

com007 发表于 2010-3-16 20:26

原帖由 friendchj 于 2010-3-16 06:39 发表 http://www.chinavib.com/forum/images/common/back.gif
利用ismember函数编个程序,可以解决这个问题:function y=findsamerow(x)
=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’是什么意思?

ChaChing 发表于 2010-3-16 21:26

回复 地板 com007 的帖子

friendchj这帖还未细看!
while 1表示永久回圈, 当sum(j)==0时, break出来

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,:)%%找出跟第一行相等的行
       b=;
   elseb=;
   end
end
ndi=find(b==1)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
最后b里面为1的表示两行相等,0则不然。。。
希望能对你有帮助!

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

com007 发表于 2010-3-17 00:28

原帖由 niuniu3 于 2010-3-16 22:07 发表 http://www.chinavib.com/forum/images/common/back.gif
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 编辑 ]

com007 发表于 2010-3-17 00:29

原帖由 ChaChing 于 2010-3-16 21:26 发表 http://www.chinavib.com/forum/images/common/back.gif
friendchj这帖还未细看!
while 1表示永久回圈, 当sum(j)==0时, break出来
哦,谢谢你
那请问friendchj的程序适用于大矩阵吗?比如6000*300的矩阵

friendchj 发表于 2010-3-17 02:25

像这种循环结构并且y没有预先分配内存,大矩阵跑起来应该比较慢

ChaChing 发表于 2010-3-17 09:39

回复 7楼 com007 的帖子

6F的仅能找出跟第一行相等的行!

com007 发表于 2010-3-17 11:22

那如果我想找到6000*100中的重复的两行呢?应该怎么改程序?请问

com007 发表于 2010-3-17 19:31

一种新算法

我想到一种新算法,但是可能有复杂度有点大:
function SearchSameRow(Inp_Matrix)
= 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分钟,希望达人改进一下,提出更好的方法

ChaChing 发表于 2010-3-17 20:23

有I/O会比较快吗!? 晚些有空再试试!

com007 发表于 2010-3-18 00:01

原帖由 ChaChing 于 2010-3-17 20:23 发表 http://www.chinavib.com/forum/images/common/back.gif
有I/O会比较快吗!? 晚些有空再试试!
感觉是因为没有用find函数,就快了点,但是不知道怎么改成最简算法?

ChaChing 发表于 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 编辑 ]
页: [1] 2
查看完整版本: 如何用find找出矩阵中完全相同的行