3 votes

Interpolation de type "plus proche voisin" dans MATLAB

Il s'agit d'une petite chose mais qui me dérange depuis un certain temps maintenant, alors j'ai pensé que je pourrais commencer à résoudre les problèmes de la foule :)

J'ai une matrice avec des horodatages et une valeur logique correspondante (ou 1/0), à savoir

of = [-inf 0 10 15 190 inf; 1 0 0 1 1 0]'

et un autre vecteur temporel, par exemple

t = 0:0.1:1e3;

ou autre, vous avez compris :)

Maintenant, comment puis-je (lisez : pourriez-vous) inter-/extrapoler l'information logique dans of pour qu'il corresponde aux horodatages dans t mais avec les logiques interpolées qui prennent toujours la dernière valeur ou la valeur actuelle, et non une valeur future ?

Je ne sais pas si cela a un sens, mais voici la sortie attendue donnée of y t2

t2 = [0 5 14 16]
output = [0 0 10 15; 0 0 0 1]'

où la première colonne de output est le temps de of utilisé dans l'interpolation. Si j'utilise interp1 et l'algorithme "le plus proche", cela donnera

interp1(of(:,1), of, t2, 'nearest')
output = [0 10 15 15; 0 0 1 1]'  

ce qui n'est pas exactement ce que je veux.

4voto

Aabaz Points 2573

En supposant que vos vecteurs sont triés, vous pouvez essayer cela, qui semble fonctionner avec votre exemple, bien que je ne l'aie pas testé de manière approfondie :

of=[-inf 0 10 15 190 inf; 1 0 0 1 1 0]';
t2 = [0 5 14 16];
index=floor(interp1(of(:,1),(1:size(of,1))',t2'));
output=of(index,:);

J'espère que cela vous aidera.

La méthode par défaut utilisée par interp1 est linear En effet, vous ne voulez pas le voisin le plus proche, mais le premier voisin inférieur ou égal (d'après ce que je comprends). Par conséquent, une simple troncature de l'index des timestamps interpolés vous donne le résultat.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X