"Ближайший сосед" - подобная интерполяция в MATLAB - PullRequest
3 голосов
/ 05 сентября 2011

Это небольшая вещь, но уже некоторое время беспокоит меня, поэтому я подумал, что позволю начать разгадку толпы:)

У меня есть матрица с метками времени и соответствующее логическое значение (или 1/0), т.е.

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

и другой вектор времени, например

t = 0:0.1:1e3;

или что-то еще, вы получите точку:)

Теперь, как мне (читай: вы) интерполировать / экстраполировать логическую информацию в of, чтобы она соответствовала меткам времени в t, но с интерполированной логикой, всегда принимающей последнее или текущее значение, а не будущее один?

Не знаю, имеет ли это смысл, но вот ожидаемый результат, полученный of и t2

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

где первый столбец output - это время of, используемое при интерполяции. Если я использую interp1 и «ближайший» алгоритм, он даст

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

что не совсем то, что я хочу.

1 Ответ

4 голосов
/ 05 сентября 2011

Предполагая, что ваши векторы отсортированы, вы можете попробовать это, что, похоже, работает с вашим примером, хотя я не тестировал его подробно:

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,:);

Надеюсь, это поможет.

Метод по умолчанию, используемый interp1, - linear, который лучше всего работает с вашим условием, потому что вам нужен не «ближайший» сосед, а первый более низкий или равный сосед (насколько я понимаю). Поэтому простое усечение интерполированного индекса меток времени дает результат.

...