如何用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
回复 楼主 supersonics 的帖子
用find好像比较麻烦啊矩阵里面是否只有0和1这两个数??
如果是的话
可以对每行用all函数来判断该行是不是全部为1或者为0 利用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 编辑 ] 原帖由 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’是什么意思?
回复 地板 com007 的帖子
friendchj这帖还未细看!while 1表示永久回圈, 当sum(j)==0时, break出来 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 编辑 ] 原帖由 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 编辑 ] 原帖由 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的矩阵 像这种循环结构并且y没有预先分配内存,大矩阵跑起来应该比较慢
回复 7楼 com007 的帖子
6F的仅能找出跟第一行相等的行! 那如果我想找到6000*100中的重复的两行呢?应该怎么改程序?请问一种新算法
我想到一种新算法,但是可能有复杂度有点大: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分钟,希望达人改进一下,提出更好的方法 有I/O会比较快吗!? 晚些有空再试试! 原帖由 ChaChing 于 2010-3-17 20:23 发表 http://www.chinavib.com/forum/images/common/back.gif
有I/O会比较快吗!? 晚些有空再试试!
感觉是因为没有用find函数,就快了点,但是不知道怎么改成最简算法? 刚试下, 的确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