MATLAB Answers

Mihai
0

Finding the index value corresponding to a value closest to 0 in an array

Asked by Mihai
on 30 Jan 2013
Latest activity Edited by Stephen Cobeldick
on 21 Jul 2016

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!

  0 Comments

Tags

Products

3 Answers

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

  2 Comments

Mihai
on 30 Jan 2013

Interesting! I don't have the stats toolbox, and I've never seen either of those 2 functions before. It seems simple enough. I briefly tried playing around with the delaunayn function, and it seems it wouldn't work if 2 elements in the array were equal. This isn't a problem for me since the elements in my Temp array will be unique.

Nearest neighbor computation comes up in engineering and science more often then you can imagine, from pdf estimation to clustering. There are advanced data structures such as kdtrees which speed up neighbor search for higher dimension data. Also knnsearch has options on what to do during a tie.


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

  1 Comment

Mihai
on 30 Jan 2013

Thanks! I think the first part of your answer is along the same route I was going for and does what I need. I have to find the index value to use it with other arrays that correspond to the Temp array.


Answer by rawand
on 21 Jul 2016
Edited by Stephen Cobeldick
on 21 Jul 2016

simply:

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(TempCalc == min(TempCalc));

  1 Comment

@rawand: This is MATLAB, which means there is absolutely no point in wasting time writing slow and ugly loops as if this were C++. Using vectorized code is faster and neater:

>> TempCalc = abs(Temp-RefTemp);
>> find(TempCalc == min(TempCalc))
ans =
     4

Join the 15-year community celebration.

Play games and win prizes!

Learn more
Discover MakerZone

MATLAB and Simulink resources for Arduino, LEGO, and Raspberry Pi

Learn more

Discover what MATLAB® can do for your career.

Opportunities for recent engineering grads.

Apply Today

MATLAB Academy

New to MATLAB?

Learn MATLAB today!