Если вы хотите разворачивания расстояния, поиск может быть сведена к только две пары кандидатов : max(A)
, min(B))
или min(A)
, max(B))
.
Так просто попробовать эти две пары:
[ma_val, ma_ind] = min(A);
[Ma_val, Ma_ind] = max(A);
[mb_val, mb_ind] = min(B);
[Mb_val, Mb_ind] = max(B);
diff1 = abs(Mb_val-ma_val);
diff2 = abs(Ma_val-mb_val);
if diff1 > diff2
result_ind_A = ma_ind;
result_ind_B = Mb_ind;
result_value = diff1;
else
result_ind_A = Ma_ind;
result_ind_B = mb_ind;
result_value = diff2;
end
Если вы хотите минимизировать расстояние: сортировка конкатенации A
и B
, отслеживание какого элемент из A
и который из B
:
C = sortrows([A(:) zeros(numel(A),1); B(:) ones(numel(B),1)] ,1);
%// C(k,2)==0 indicates element k comes from A; 1 indicates from B
Теперь, используйте петлю for
для перемещения всех элементов в C(:,1)
, которые исходят от B
. Для каждого такого элемента найдите два элемента из A
, которые расположены ближе всего выше и ниже слева в C
. Это единственные кандидаты от A
, чтобы быть ближе к этому элементу от A
.
Для каждого элемента от B
у вас есть два кандидата от A
, что значительно снижает сложность проблемы.
Просьба уточнить, хотите ли вы максимальное или минимальное расстояние. Ваш заголовок и код говорят min, ваш текст говорит max –
Является ли 'size (A)' right? Не должно быть '[numel (A) numel (B)]'? – Divakar
Итак, ваши размеры: 'size (A) == [100000,1]' и 'size (B) == [300000,1]', и вы хотите найти точки 'A (i)' и 'B (j) ', так что' abs (A (i) -B (j)) 'как можно меньше? – knedlsepp