Для небольших наборов данных, кажется, что мой оригинальный подход был быстрее, чем оба ismember
, предложенное Дивакаром и решением intersect
, предложенное qmeeeeeee, но все три избили решение Луиса Мендо, используя старые добрые 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
, которые используются для тестирования, разница кажется довольно большой. Более подробные тесты можно найти в комментариях ниже.
Ударьте меня на несколько секунд haha +1 –
именно то, что я искал, спасибо! –
Вы? Написание цикла 'for'? Что случилось? – Adriaan