【问题标题】:How to select desired elements without using for-loop?如何在不使用 for 循环的情况下选择所需的元素?
【发布时间】:2016-04-20 15:21:56
【问题描述】:

我正在编写 MATLAB 代码。数组universe 具有递增的整数(正数,不大于 1000)作为条目(不一定是连续的)。可能是[3,10,20,24,25,100,120,...,1000]universe的长度以200为界。

Candidates 是一个2-by-k 数组,其中包含从universe 中随机选择的条目,因此第一行已排序,并且对于每一列,第一行小于第二行。好像

Candidates = [3, 3, 20;
              10,25,24]

k=3。通常k小于1000。我知道如何在没有for循环的情况下生成Candidates

Nodes 是一个3-by-(n^2-n) 数组,其中第一行和第二行包含来自universe 的条目,并排序为第一行是主键,第二行是辅助键。第三行没有约束。好像

Nodes = [3,  3,  3,  20, 20, 20, 24, 24, 24, 25, 25, 25; 
         20, 24, 25, 3,  24, 25, 3,  20, 25, 3,  20, 24; 
         1,  2,  3,  0,  0,  0,  0,  0,  0,  3,  2,  1] 

基本上第一行和第二行是同一个multi-set,而第一行是分组排序,第二行是循环排序。

问题是,我们如何从Nodes 中选择列,以使Nodes(1:2,i) 出现在Candidates 的列之一中?

天真的方式是

Result = [];
k = 3;
n = 4;
j_start = 1;
for i=1:(n^2-n)
  for j=j_start:k
    if isequal(Nodes(1:2,i),Candidates(:,j))
      Result = [Result,Nodes(:,i)];
      j_start = j+1;
      break;
    end;
  end;
end;

没有for-loops 我们能做到吗?任何hashtable、contianer等解决方案都可以,只要能提高效率。

【问题讨论】:

    标签: arrays performance matlab for-loop hashtable


    【解决方案1】:

    您可以使用ismember,但您必须转置,因为没有'columns' 标志:

    Results = Nodes(:, ismember(Nodes(1:2,:)', Candidates', 'rows'))
    

    【讨论】:

      猜你喜欢
      • 2020-02-26
      • 2023-02-05
      • 1970-01-01
      • 2018-03-21
      • 2022-01-22
      • 1970-01-01
      • 2018-05-17
      • 2017-05-01
      • 2011-02-22
      相关资源
      最近更新 更多