【问题标题】:implementing "not equal to " loop in matlab在matlab中实现“不等于”循环
【发布时间】:2013-11-28 07:02:08
【问题描述】:

我有一个简单的问题,我对 matlab 很陌生,所以我在实现它时遇到了问题,我有两个 64x2 矩阵 u 和 h。我必须检查 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

谁能帮帮我

【问题讨论】:

  • 我尝试使用 not equal to as u(i,:)~=h(j,:) 使用另一个循环来完成此操作,但无法给出更好的结果
  • if 语句中的条件应该是标量。使用all(u(i,:)==h(j,:))isequal(u(i,:), h(j,:)
  • 我已经尝试过,但它给出了相同的答案,我在 r 矩阵中得到了 u 的所有值,而我只需要那些在 h 矩阵中不存在的 u 值
  • 您对格式、大写 I 和/或标点符号有意见吗?请格式化您的问题!

标签: matlab loops matrix


【解决方案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】:

    使用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
    

    【讨论】:

    • setdiff 很好,虽然它的复杂度为 NlogN!
    【解决方案3】:

    您在 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 的行i 等于h 的行j,则destination_uh(i+N) 等于destination_uh(j)

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

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

    【讨论】:

      猜你喜欢
      • 2014-09-16
      • 2018-09-21
      • 1970-01-01
      • 1970-01-01
      • 2015-04-14
      • 1970-01-01
      • 1970-01-01
      • 2020-02-18
      • 1970-01-01
      相关资源
      最近更新 更多