Asked by Mihai
on 30 Jan 2013

Hi,

I have an array with x amount of values. How can I find the index value of the element that is closest or equal to a certain value?

I tried it in the following manner, but it doesn't work when the value of the element in Temp is equal to the RefTemp value.

Temp = [-15.3, 0.2, 15.2, 30, 45.3]; RefTemp = 30; %Value to compare the Temp array values to

for ii = 1:length(Temp) TempCalc(ii) = abs(Temp(ii) - RefTemp); end

find(min(TempCalc));

Thank you very much for your help!

Answer by Shashank Prasanna
on 30 Jan 2013

Accepted answer

Do you have the Stats toolbox? if you do then do a nearest neighbor search as follows:

location = knnsearch(Temp',30);

If you don't have stats toolbox then use delauny to do nn search:

>> tri = delaunayn(Temp'); >> dsearchn(Temp',tri,30)

ans =

4

Mihai
on 30 Jan 2013

Shashank Prasanna
on 30 Jan 2013

Answer by Cedric Wannaz
on 30 Jan 2013

Edited by Cedric Wannaz
on 30 Jan 2013

You have several options. The first question is: do you really need the index, or could you use a vector of logicals, e.g. for indexing something else. Look at the following; we want to extract all volumes associated with temperatures that are closest to a ref value:

>> temp = [-15.3, 0.2, 15.2, 30, 45.3]; >> volume = [4, 7, 28, 35, 20] ; >> ref = 27.2 ; >> dif = abs(temp-ref) dif = 42.5000 27.0000 12.0000 2.8000 18.1000 >> min(dif) ans = 2.8000 >> match = dif == min(dif) match = 0 0 0 1 0 % Vector of logicals indicate % where dif equals its min. >> idx = find(dif == min(dif)) idx = 4 % Index of element that % the min matches

Now you can extract the corresponding volume with either the vector of logicals (which avoids using find()) or the index.

>> volume(match) ans = 35 >> volume(idx) ans = 35

This is one "vector" way to achieve what you want; without all the extra steps, this reduces to:

>> dif = abs(temp-ref) ; >> volume(dif == min(dif)) ans = 35

Opportunities for recent engineering grads.

## 0 Comments