2013-11-28 38 views
-2

我有一个简单的问题,我对matlab很新,所以我在实现它时遇到了问题我有两个64x2矩阵u和hi必须检查u中的单个行是不是等于h中的所有行,那么不相等的行应该保存在一个单独的矩阵中,同时我写了这段代码,但它做的是r(i,:)得到u(i, :)当这段代码运行时,我想要的是只有那些u(i,:)的值应该存储在r中,它们与h矩阵中的任何行都不相似。在matlab中实现“不等于”循环

h=[]; 
for j=1:8 
    for i=1:8 
     h=[h; i j]; 
    end 
end 
u=[5.3,1.4;6,8;2,3;3,5.5;2.6,8;3.7,2;4,2;5,3;1.9,8;5.4,4;3.2,3;2,2;2,4;2,3;8,2.2;8,4;7.3,1.5;6.2,5.1;2.4,1.5;3,5;2,7.1;1.8,2.7;3,4;6,5;6,1;5,4;4,6;3.5,2;5,7;7.2,8;7,7;5,5;6,3;6,6;1,2;5,8;3,5;1,5;2,2;2,1;6,3;4,7;6,8;3,6;1,6;5,2;3,5;8,7;8,4;4,8;1,1;6,3;7,5;8,1;1,6;4,5;5,5;6,7;6,7;6,7;6,3;3,4;5,7;1,1] 
for i=1 
    for j=1:64 
    if u(i,:)==h(j,:) 
c=1 
    else 
     c=0 
     if c==0 
       r(i,:)=u(i,:) 
     end 
    end 
    end 
end 

谁能帮助我,请

+0

我试图用另一个循环使用不等于u(i,:)〜= h(j,:)但不能给出更好的结果ts –

+1

'if'语句中的条件应该是标量。使用'all(u(i,:)== h(j,:))'或'isequal(u(i,:),h(j,:)' – Mikhail

+0

我已经尝试了,但它给出了相同的答案,我在r矩阵中得到了u的所有值,而我只需要那些不存在于h矩阵中的u值 –

回答

1

你可以用ismember做到在一个行:

r = u(~ismember(u,h,'rows'),:); 

有了您的数据。例如,结果是

>> r  
r = 
    5.3000 1.4000 
    3.0000 5.5000 
    2.6000 8.0000 
    3.7000 2.0000 
    1.9000 8.0000 
    5.4000 4.0000 
    3.2000 3.0000 
    8.0000 2.2000 
    7.3000 1.5000 
    6.2000 5.1000 
    2.4000 1.5000 
    2.0000 7.1000 
    1.8000 2.7000 
    3.5000 2.0000 
    7.2000 8.0000 
+0

谢谢你解决了我的问题 –

+0

@DuaMalik谢谢。在这种情况下,请将问题标记为“接受” –

1

使用setdiff'rows'选项计算r。请避免不必要的循环。尽可能预分配。

% construct h without loop 
[h{1} h{2}]=ndgrid(1:8,1:8); 
h=[h{1}(:) h{2}(:)]; 
% get r using setdiff 
r = setdiff(u, h, 'rows') 

结果与你

r = 
1.8000 2.7000 
1.9000 8.0000 
2.0000 7.1000 
2.4000 1.5000 
2.6000 8.0000 
3.0000 5.5000 
3.2000 3.0000 
3.5000 2.0000 
3.7000 2.0000 
5.3000 1.4000 
5.4000 4.0000 
6.2000 5.1000 
7.2000 8.0000 
7.3000 1.5000 
8.0000 2.2000 
+0

setdiff很不错,虽然它具有复杂性NlogN! – user2987828

0

解在NlogN复杂问题(N = 64):

N=size(h,1); 
[husorted,origin_husorted,destination_hu]=unique([h;u],'rows','first'); 
iduplicates=destination_hu(N+1:end)<=destination_hu(N),:); 
r=u; 
r(iduplicates,:)=0; 

destination_uhunique唯一输出是有用的;它验证[h;u]=husorted(destination_uh,:)]'first'确保如果u的线ih的线j相等,则destination_uh(i+N)等于destination_uh(j)

解决方案为您的特定小时,复杂N:

r=u; 
r(all(u==round(u)&u>=1&u<=8,2),:)=0;