在matlab中实现“不等于”循环

时间:2013-11-28 07:02:09

标签: matlab loops matrix

我有一个简单的问题我对matlab很新,所以我在实现它时遇到问题我有两个64x2矩阵你好,你必须检查u中的单行是否不等于h中的所有行。那么不相等的行应该保存在一个单独的矩阵中,同时我已经编写了这段代码,但它的作用是r(i,:)得到u(i,:)的所有值当这段代码运行时,我是什么希望只有那些u(i,:)的值应存储在r中,这与h矩阵中的任何行都不相似。

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

任何人都可以帮助我

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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

答案 2 :(得分: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_uh是唯一有用的unique输出;它验证[h;u]=husorted(destination_uh,:)]'first'确保i的行uj的行h相等,destination_uh(i+N)等于destination_uh(j)

特定h的解决方案,复杂度为N:

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