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?
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);
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)
Que diriez-vous de min(abs(data - b))
?
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).
data = [1 1.2 1.3 1.5 1.8]
b = 1.23
find(abs(data-b)==min(abs(data-b)))
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