Вы может попробовать решение по этим линиям:
tol = 0.1;
N = 1000000;
a = randn(1, N)*1000; % create a randomly
b = a + tol*rand(1, N); % b is "tol" away from a
a_bin = floor(a/tol);
b_bin = floor(b/tol);
result = ismember(b_bin, a_bin) | ...
ismember(b_bin, a_bin-1) | ...
ismember(b_bin, a_bin+1);
find(result==0) % should be empty matrix.
Идея состоит в том, чтобы дискретизировать переменные a и b в ячейках размером tol
. Затем вы спрашиваете, найден ли b в том же ящике, что и любой элемент из a, или в корзине слева от него, или в корзине справа от него.
Преимущество: Я считаю ismember
умно внутри, сначала сортируют элементы a
, а затем выполняют сублинейный (журнал (N)) для каждого элемента поиска б. Это не похоже на подходы, которые явно строят различия каждого элемента в b с элементами из a, то есть сложность линейна по числу элементов в a.
Сравнение: для N=100000
это работает 0.04s на моей машине, по сравнению с 20 с использованием линейного поиска (приурочен с использованием приятного и лаконичного решения tf = arrayfun(@(bi) any(abs(a - bi) < tol), b);
Алана).
Недостатки: это приводит к тому, что фактический допуск - это что-то среднее между tol и 1.5 * tol. Зависит от вашей задачи, можете ли вы с этим жить (если единственная проблема - сравнение с плавающей запятой, вы можете).
Примечание: зависит ли это от жизнеспособного подхода от диапазонов a и b и значения tol. Если a и b могут быть очень большими, а tol очень мал, a_bin
и b_bin
не смогут разрешить отдельные ячейки (тогда вам придется работать со встроенными типами, снова тщательно проверяя, что их диапазоны достаточно). Решение с петлями является более безопасным, но если вам действительно нужна скорость, вы можете инвестировать в оптимизацию представленной идеи. Другим вариантом, конечно же, было бы написать расширение mex.
Значит, вы сравниваете «A (i)» с «B (i)»? Почему бы не опубликовать существующий код цикла, и люди могут предлагать улучшения оттуда. – weston
Вот решение для члена с допуском. Это примерно в два раза медленнее, чем решение, отправленное @ondav, но более точно справляется с допуском. http://www.mathworks.com/matlabcentral/fileexchange/23294-ismember/content/ismemberf.m –