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

1,595 ビュー (過去 30 日間)
Ole
Ole 2015 年 3 月 27 日
コメント済み: Din N 2023 年 3 月 17 日
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 件のコメント
Jose
Jose 2023 年 2 月 15 日
編集済み: Jose 2023 年 2 月 15 日
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 2023 年 3 月 17 日
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?

サインインしてコメントする。

採用された回答

per isakson
per isakson 2015 年 3 月 27 日
編集済み: per isakson 2019 年 4 月 2 日
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 件のコメント
Richard Barrett-Jolley
Richard Barrett-Jolley 2018 年 2 月 1 日
Bingo. That does it. Thanks
Peter Kövesdi
Peter Kövesdi 2019 年 4 月 2 日
Take care: This routine fails with uint data types. Transform them to double first:
double(x);
or
double(val);
as needed.

サインインしてコメントする。

その他の回答 (3 件)

Peter Kövesdi
Peter Kövesdi 2019 年 4 月 1 日
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 件のコメント
Andoni Medina Murua
Andoni Medina Murua 2022 年 8 月 18 日
編集済み: Andoni Medina Murua 2022 年 8 月 18 日
However
interp1(x,1:length(x),val,'nearest');
works in case val is an array, which doesn't happen with
min( abs( x-val ) );

サインインしてコメントする。


Revant Adlakha
Revant Adlakha 2021 年 2 月 26 日
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));
  1 件のコメント
Ernest Nachaki
Ernest Nachaki 2022 年 5 月 27 日
Try this
index = fix(interp1(array,find(array),value));

サインインしてコメントする。


Ernest Nachaki
Ernest Nachaki 2022 年 5 月 27 日
Try this
index = fix(interp1(array,find(array),value));

カテゴリ

Help Center および File ExchangeMatrix Indexing についてさらに検索

製品

Community Treasure Hunt

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

Start Hunting!

Translated by