Finding the index value corresponding to a value closest to 0 in an array
Show older comments
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!
Accepted Answer
More Answers (4)
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
2 Comments
Mihai
on 30 Jan 2013
Satish Tadepalli
on 11 Nov 2016
awesome explanation @ Cedric Wannaz.
Kasper Ornstein-Mecklenburg
on 24 Oct 2017
Edited: Kasper Ornstein-Mecklenburg
on 24 Oct 2017
The min function returns index as second output.
>> a = [-15.3, 0.2, 15.2, 30, 45.3]; %Define vector to analyze
>> aRef = 30; %Set reference
>> aDiff = abs(a - aRef); %Calculate diff
>> [minVal, minInd] = min(aDiff); %Find value closest to aRef
>> a(minInd)
ans =
30
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: there is absolutely no point in wasting time writing slow and ugly loops as if this were some low-level language like C. MATLAB is a high-level language, and vectorized code is faster and neater:
>> TempCalc = abs(Temp-RefTemp);
>> find(TempCalc == min(TempCalc))
ans =
4
Robert Brandalik
on 17 Mar 2017
Also an Option:
unique([find(Temp-RefTemp == min(complex(Temp-RefTemp))),find(RefTemp-Temp == min(complex(RefTemp-Temp)))])
Categories
Find more on Matrix Indexing in Help Center and File Exchange
Products
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!