Как мне найти значения, близкие к заданному значению? - PullRequest
21 голосов
/ 11 ноября 2011

у меня data = [1 1.2 1.3 1.5 1.8]

Я хочу найти ближайшие значения до и после из данных для этой точки, b = 1.23

Как мне это сделать?

Ответы [ 6 ]

23 голосов
/ 06 июня 2013

Вот еще один метод.Вектор data не нужно сортировать, а b может быть положительным или отрицательным.

[~,I] = min(abs(data-b));
c = data(I);
10 голосов
/ 11 ноября 2011

если данные отсортированы, вы можете использовать find:

i_lower  = find(data <= b,1,'last');
i_higher = find(data >= b,1,'first');

lower_than_b  = data(i_lower)
higher_than_b = data(i_higher)
4 голосов
/ 11 ноября 2011

Как насчет min(abs(data - b))?

2 голосов
/ 07 августа 2017

Этот метод обобщает ответ Сомнения на случай, когда в b есть несколько элементов, которые вы ищете:

ind=knnsearch(data',b) c=data(ind)

, который возвращает индекс (или массив индексов), ind, ближайшего элемента (или элементов) в data к элементам, перечисленным в b.

Обратите внимание, что данные транспонируются, поскольку набор для поиска должен быть вектором столбца. Если бы иметь несколько элементов, то это также должен быть вектор-столбец.

Кроме того, этот метод можно обобщить, чтобы получить 2-го, 3-го, 4-го ... ближайших соседей (см. Документацию).

Это также обобщает на случай, когда данные являются многомерными (если d измерения, то test и b будут иметь d столбцы).

1 голос
/ 27 ноября 2018

Это может быть немного хакерским и неэффективным, но я использую interp1, чтобы найти единственное ближайшее значение следующим образом:

nearestTo = @(x, xq) interp1(x, x, xq, 'nearest');
nearestTo([2 4 6 8 10], [pi 2*pi 3*pi])  %  4  6  10
nearestTo(sort([2 7 11 3 5]), abs(-3.5)) %  3
0 голосов
/ 27 ноября 2014
data = [1 1.2 1.3 1.5 1.8]

b = 1.23

find(abs(data-b)==min(abs(data-b)))
...