web-dev-qa-db-fra.com

Comment trouver des valeurs proches d'une valeur donnée?

J'ai data = [1 1.2 1.3 1.5 1.8]

Je veux trouver les valeurs les plus proches avant et après des données pour ce point, b = 1.23

Comment puis-je faire cela?

21
nsy

Voici une autre méthode. Le vecteur data n'a pas besoin d'être trié et b peut être positif ou négatif.

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

si les données sont triées, vous pouvez utiliser 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)
9
bdecaf

Que diriez-vous de min(abs(data - b))?

4

Cette méthode généralise la réponse de Doubt au cas où il y a plusieurs éléments dans b que vous recherchez:

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

qui retourne l'index (ou le tableau d'indices), ind, de l'élément (ou des éléments) le plus proche dans data aux éléments listés dans b.

Notez que les données sont transposées car l'ensemble à rechercher doit être un vecteur de colonne. Si vous avez plusieurs éléments, il devrait également s'agir d'un vecteur colonne.

En outre, cette méthode peut être généralisée pour donner les 2e, 3e, 4e ... voisins les plus proches (voir documentation).

Il se généralise également au cas où les données sont de dimension supérieure (Si d dimensions, alors test et b auraient d colonnes).

2
cantorhead
data = [1 1.2 1.3 1.5 1.8]

b = 1.23

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

Cela pourrait être un peu hacky et inefficace, mais j'utilise interp1 pour trouver la valeur unique la plus proche comme suit:

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
0
Alex Hirzel