对于小型数据集,我原来的方法似乎比 Divakar 提出的 ismember 解决方案和 qmeeeeeee 提出的 intersect 解决方案都快,但所有这三个都被 Luis Mendo 的解决方案击败使用好旧的bsxfun。请参阅下面的代码,每种方法的时间:
function somescript()
IsmemberTime = timeit(@membersol)
IntersectTime = timeit(@intersectsol)
FindTime = timeit(@naivesol)
BsxTime = timeit(@bsxfunsol)
function membersol()
rng(1)
set = randi(30,[1000 15]); % generate 1000 vectors of length 15, containing random integers
for i=1:1000
[~,out] = ismember(set(i,1:5),set(i,6:end)); % first 5 random integers are the values to be found in the remainder of the vector
end
end
function intersectsol()
rng(1)
set = randi(30,[1000 15]);
for i=1:1000
[~,~,Output] = intersect(set(i,1:5),set(i,6:end));
end
end
function naivesol()
rng(1)
set = randi(30,[1000 15]);
for i=1:1000
Output = find(ismember(set(i,6:end),set(i,1:5)));
end
end
function bsxfunsol()
rng(1)
set = randi(30,[1000 15]);
for i=1:1000
[~, Output] = max(bsxfun(@eq, set(i,1:5).', set(i,6:end)), [], 1);
end
end
end
在我的机器上(运行 R2014b)返回以下时间:
IsmemberTime =
0.1101
IntersectTime =
0.2008
FindTime =
0.0698
BsxTime =
0.0218
这表明,至少对于小型数据集,在向量的倒序上使用 find 和 ismember 实际上比单独使用 ismember 更快。由于生成用于测试的数据集set 的所有方法也有一些固定开销,因此差异似乎很大。更彻底的测试可以在下面的 cmets 中找到。