如何在不使用for-loop的情况下选择所需的元素?

时间:2016-01-15 03:59:05

标签: arrays performance matlab for-loop hashtable

我正在编写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] 

基本上第一行和第二行具有相同的多组,而第一行按分组排序,第二行按循环排序。

问题是,我们如何选择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 - 循环的情况下完成吗?任何像哈希表,contianer这样的解决方案都是受欢迎的,只要效率可以提高。

1 个答案:

答案 0 :(得分:0)

您可以使用ismember,但由于没有'columns'标记,您必须进行转置:

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