nsy
nsy

Reputation: 249

How do I find values close to a given value?

I have data = [1 1.2 1.3 1.5 1.8]

I want to find closest values before and after from data for this point, b = 1.23

How do I do this?

Upvotes: 22

Views: 33611

Answers (6)

Alex Hirzel
Alex Hirzel

Reputation: 1844

This might be a little bit hacky and inefficient, but I use interp1 to find the single closest value as follows:

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

Upvotes: 1

cantorhead
cantorhead

Reputation: 121

This method generalizes Doubt's answer to the case where there are multiple elements in b that you are searching for:

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

which returns the index (or array of indices), ind, of the closest element (or elements) in data to the elements listed in b.

Note that data is transposed because the set to be searched in needs to be a column vector. If be had multiple elements then it should also be a column vector.

Also, this method can be generalized to give 2nd, 3rd, 4th ... closest neighbors (see documentation).

It also generalizes to the case when the data is higher dimensional (If d dimensions then test and b would have d columns).

Upvotes: 2

Oliver Charlesworth
Oliver Charlesworth

Reputation: 272687

How about min(abs(data - b))?

Upvotes: 5

Aliton Oliveira
Aliton Oliveira

Reputation: 1349

data = [1 1.2 1.3 1.5 1.8]

b = 1.23

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

Upvotes: 0

Doubt
Doubt

Reputation: 1222

Here is another method. The vector data need not be sorted and b can be positive or negative.

[~,I] = min(abs(data-b));
c = data(I);

Upvotes: 23

bdecaf
bdecaf

Reputation: 4732

if the data is sorted you can use 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)

Upvotes: 11

Related Questions