我知道我在游戏中已经很晚了,但我真的很想找到一个更快的解决方案,就像会员一样优雅.确实有一个采用无证件的
ismembc功能:
ismembc(v, i)
基准
N = 7;
i = [3 5];
%// slayton's solution
tic
for ii = 1:1e5
clear idx;
idx(N) = false;
idx(i) = true;
end
toc
%// H.Muster's solution
tic
for ii = 1:1e5
v = 1:N;
idx = ismember(v, i);
end
toc
%// Jonas' solution
tic
for ii = 1:1e5
idx = sparse(i, 1, true, N, 1);
end
toc
%// ismembc solution
tic
for ii = 1:1e5
v = 1:N;
idx = ismembc(v, i);
end
toc
这是我得到的:
Elapsed time is 1.482971 seconds.
Elapsed time is 6.369626 seconds.
Elapsed time is 2.039481 seconds.
Elapsed time is 0.776234 seconds.
令人惊讶的是,ismembc确实是最快的!
编辑:
对于非常大的N值(即,当v是大数组时),更快的解决方案实际上是slayton(和HebeleHododo,就此而言).您有多种策略可供选择,请仔细挑选:)
由H.Muster编辑:
以下是基准测试结果,包括_ismemberoneoutput:
Slayton's solution:
Elapsed time is 1.075650 seconds.
ismember:
Elapsed time is 3.163412 seconds.
ismembc:
Elapsed time is 0.390953 seconds.
_ismemberoneoutput:
Elapsed time is 0.477098 seconds.
有趣的是,Jonas的解决方案不适用于我,因为我得到一个指数超过矩阵维度.错误…
由hoogamaphone编辑:
值得注意的是,ismembc要求两个输入都是数字,排序,非稀疏,非NaN值,这是一个可以在source documentation中轻易错过的细节.