我正在编写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这样的解决方案都是受欢迎的,只要效率可以提高。
答案 0 :(得分:0)
您可以使用ismember
,但由于没有'columns'
标记,您必须进行转置:
Results = Nodes(:, ismember(Nodes(1:2,:)', Candidates', 'rows'))