Найдите индекс ближайшего числового значения

Скажем, у меня есть 2 матрицы в matlab:

A = [1 4 6 9 11 13 15 18 21]

B = [2 10 19]

Есть ли функция, которую я могу использовать, чтобы для каждого элемента в B я мог найти индекс ближайшего к этому элементу значения в A. Например, в приведенном выше примере: 2,10 и 19 численно ближе всего к 1,9 и 18 в A, а индексы 1, 9 и 18 - 1,4 и 8, поэтому функция должна вернуть [1 4 8].

Я знаю, что могу использовать для этого циклы, но на самом деле Matlab не любит циклы, плюс мои матрицы слишком велики, и повторение всех значений будет очень дорогостоящим по времени.


person vsx06    schedule 16.04.2013    source источник
comment
В настоящее время я сокращаю временные затраты, сортируя две матрицы, а затем ищу значения таким образом, чтобы индекс последнего ближайшего найденного значения в A сохранялся, а затем поиск ближайшего значения для следующего элемента в B начинается с этого сохраненного значение вместо 1. каждый раз.   -  person vsx06    schedule 17.04.2013
comment
Спасибо за указатель на пост. Пригодилось :)   -  person vsx06    schedule 17.04.2013
comment
@ vsx06 knnsearch - очевидный ответ.   -  person Autonomous    schedule 17.04.2013
comment
@Parag: knnsearch доступен с какого выпуска MATLAB?   -  person fpe    schedule 17.04.2013
comment
@fpe как это проверить? Я использую R2011b и его там.   -  person Autonomous    schedule 17.04.2013
comment
@Parag knnsearch находится в панели инструментов статистики   -  person Dan    schedule 17.04.2013
comment
@Dan Да, я знаю это, но как проверить, в какой версии MATLAB он был представлен?   -  person Autonomous    schedule 17.04.2013
comment
@Parag Я не знаю, но я хочу сказать, что тот факт, что он находится в панели инструментов, объясняет, почему fpe или другие пользователи могут не иметь к нему доступа.   -  person Dan    schedule 17.04.2013


Ответы (1)


Я бы поступил следующим образом:

% clc,clear all,close all
A = [1 4 6 9 11 13 15 18 21];
B = [2 10 19];
C = abs(bsxfun(@minus,A',B));
[~,idx] = min(C(:,1:size(C,2)))
person fpe    schedule 16.04.2013
comment
Пожалуйста, не добавляйте clc,clear all,close all. Возможно, я захочу сохранить в кеше все выполняемые функции для повышения производительности и оставить свои цифры открытыми. - person Oleg; 17.04.2013
comment
Почему не короче [~, idx] = min(abs(A'-B))? - person tstenner; 26.03.2019