web-dev-qa-db-ja.com

特定の値に近い値を見つけるにはどうすればよいですか?

私が持っています data = [1 1.2 1.3 1.5 1.8]

このポイントのデータから、前後の最も近い値を見つけたいb = 1.23

どうすればよいですか?

22
nsy

ここに別の方法があります。ベクトルdataはソートする必要がなく、bは正または負の値にすることができます。

[~,I] = min(abs(data-b));
c = data(I);
23
Doubt

データがソートされている場合は、findを使用できます。

i_lower  = find(data <= b,1,'last');
i_higher = find(data >= b,1,'first');

lower_than_b  = data(i_lower)
higher_than_b = data(i_higher)
11
bdecaf

min(abs(data - b))はどうですか?

5

この方法は、検索しているbに複数の要素がある場合のDoubtの回答を一般化したものです。

ind=knnsearch(data',b) c=data(ind)

これは、indにリストされたエレメントにdataで最も近いエレメント(またはエレメント)のインデックス(またはインデックスの配列)bを返します。

検索されるセットは列ベクトルである必要があるため、データが転置されることに注意してください。複数の要素がある場合は、列ベクトルでもある必要があります。

また、この方法を一般化して、2番目、3番目、4番目...の最近傍を指定することもできます(ドキュメントを参照)。

また、データが高次元である場合にも一般化されます(d次元の場合、testおよびbにはd列が含まれます)。

2
cantorhead

これは少しハックで非効率的かもしれませんが、私はinterp1は、次のように単一の最も近い値を検索します。

nearestTo = @(x, xq) interp1(x, x, xq, 'nearest');
nearestTo([2 4 6 8 10], [pi 2*pi 3*pi])  %  4  6  10
nearestTo(sort([2 7 11 3 5]), abs(-3.5)) %  3
1
Alex Hirzel
data = [1 1.2 1.3 1.5 1.8]

b = 1.23

find(abs(data-b)==min(abs(data-b)))
0
Aliton Oliveira