Отображение числового массива на второй числовой массив

Я пишу, потому что мне было интересно, если вы, ребята, могли бы предложить следующую проблему с "отображением массива" в MATLAB

У меня есть покрытие временного массива, год с шагом в одну минуту (T1) и другой массив времени (T2), который распределен неоднородно и не (обязательно) перекрывается с T1. Примером может быть:

T1 = [1-Jan-2011 00:01:23, 1-Jan-2011 00:02:23.... end of year 2011]
T2 = [1-Jan-2011 00:04:12, 1-Jan-2011 03:014:54, ....]

Т1 и Т2 на самом деле в datenum формат, но я хотел бы привести четкий пример здесь.

Длина двух не одинакова, (length(T1) ~ 5*length(T2)), но я знаю, что никакие два элемента T2 не находятся в одном интервале в T1. Я имею в виду, что элемент T2 всегда будет однозначно идентифицирован одним из элементов T1.

То, что я хочу сделать, это (эффективно = быстро) отображать T2 на T1, так что у меня есть набор индексов idx такой, что T1(idx(n)) ближайший момент времени к T2(n), У меня уже есть рутина, но это немного медленно.

Предложения?

Заранее большое спасибо! Riccardo

1 ответ

Решение

Насколько я вижу, результат datenum простые числа.

[~,idx1]=sort([T1+offset,T2]);
idx = find(idx1>length(T1));
idx = idx - (0:length(idx)-1);

Если вы пропустите offset (или использовать 0), это даст вам для каждого элемента T2 индекс наименьшего элемента, если T1 это больше. Чтобы добраться до ближайшего, добавьте половину длины интервала в T1 в T1 (т.е. datenum эквивалент пол минуты).

[править] Если T1 не состоит из эквидистантных шагов, можно попробовать с вектором, содержащим середину каждого интервала в T1 вместо.

T1m = [(T1(1:end-1) + T1(2:end))/2];
[~,idx1]=sort([T1m,T2]);
idx = find(idx1>length(T1m)) - (0:length(T2)-1);

[/редактировать]

Как это работает:

Сначала мы сортируем вектор всех временных точек, а затем игнорируем фактический результат ~ по имени переменной, например T если хочешь его использовать как-нибудь). Второе возвращаемое значение sort является индексом каждой записи отсортированного массива в исходном массиве. Мы хотим знать, откуда они T2 в конечном итоге, то есть те, которые в исходном, сцепленном массиве [T1 T2] иметь индекс больше, чем число значений в T1, какой idx со второй строки. Теперь эти индексы относятся к элементам объединенного массива, что означает относительно T1 они правильны для первого элемента, выключены на один для второго (так как первый элемент T2 был брошен раньше), на два за третий (так как два элемента T2 раньше)..., который мы исправляем в третьей строке.

Вы можете объединить вторую и третью строку idx = find(idx1>length(T1)) - (0:length(T2)-1);

Другие вопросы по тегам