Effacer les filtres
Effacer les filtres

How to find the index of the closest value to some number in 1D array ?

1 127 vues (au cours des 30 derniers jours)
Ole
Ole le 27 Mar 2015
Commenté : Din N le 17 Mar 2023
How to find the index in 1D array that has closest value to some number ?
val =-1.03
val1 = 1.04
x = -10:0.009:10
ind1 = find (A==val) % will work if the val is exact match
  2 commentaires
Jose
Jose le 15 Fév 2023
Modifié(e) : Jose le 15 Fév 2023
Index=find(min(abs(Array-target))==abs(Array-target))
that should work even if the # of sig digits change in your array. It finds the location of value in the array, that when substracted from your target value has the smallest difference (i.e. closest match).
Din N
Din N le 17 Mar 2023
This does give the closest value, but if you want the closest value to be smaller than your target value? For example if my target value is 7300, how can I specify here that I only want the index for the closest value that is smaller than 7300?

Connectez-vous pour commenter.

Réponse acceptée

per isakson
per isakson le 27 Mar 2015
Modifié(e) : per isakson le 2 Avr 2019
Hint:
>> [ d, ix ] = min( abs( x-val ) );
>> x(ix-1:ix+1)
ans =
-1.0360 -1.0270 -1.0180
ix is the "index in 1D array that has closest value to" val
"if the val is exact match"   that's tricky with floating point numbers
  2 commentaires
Richard Barrett-Jolley
Richard Barrett-Jolley le 1 Fév 2018
Bingo. That does it. Thanks
Peter Kövesdi
Peter Kövesdi le 2 Avr 2019
Take care: This routine fails with uint data types. Transform them to double first:
double(x);
or
double(val);
as needed.

Connectez-vous pour commenter.

Plus de réponses (3)

Peter Kövesdi
Peter Kövesdi le 1 Avr 2019
ind = interp1(x,1:length(x),val,'nearest');
also does it.
But a short comparison shows disadvantages in timing:
f1=@()interp1(x,1:length(x),val,'nearest');
f2=@()min( abs( x-val ) );
timeit(f1)>timeit(f2)
  1 commentaire
Andoni Medina Murua
Andoni Medina Murua le 18 Août 2022
Modifié(e) : Andoni Medina Murua le 18 Août 2022
However
interp1(x,1:length(x),val,'nearest');
works in case val is an array, which doesn't happen with
min( abs( x-val ) );

Connectez-vous pour commenter.


Revant Adlakha
Revant Adlakha le 26 Fév 2021
You could also use something like this, where f(x) is the function and x is the value of interest.
ind = find(min(abs(f(x) - x)) == abs(f(x) - x));

Ernest Nachaki
Ernest Nachaki le 27 Mai 2022
Try this
index = fix(interp1(array,find(array),value));

Catégories

En savoir plus sur Matrix Indexing dans Help Center et File Exchange

Produits

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by