MATLAB — Мои условия цикла while для извлечения конкретных данных из временного ряда

Фон

У меня есть 4 набора данных: один — это данные о погоде с временем и давлением, а другой — набор данных датчика давления с тем же самым; время и давление. По сути, оба являются временными рядами. Более длинные временные ряды — это данные о погоде, которые содержат около 64008 точек данных для обеих переменных. Более короткий временной ряд для датчиков давления — 51759. Можно сказать, что более короткий временной ряд является подмножеством более длинного временного ряда с некоторыми отсутствующими точками данных. Несмотря на это, я хочу получить давление для погоды, но только для времени, которое есть у моего датчика.

Мотивация

Итак, в основном, я пытаюсь реализовать цикл while, чтобы для каждого эквивалентного времени моего датчика давления и данных я брал давление из данных о погоде. Мне не нужно записывать время из данных о погоде, потому что я могу просто использовать временную последовательность с моего датчика давления.

Пример

Чтобы получить представление о том, о чем я говорю, я сделал пример сценария, и он отлично работает.

x(:,1) = (1:50)';
x(:,2) = (51:100)';
y(:,1) = [1:12 20:25 40:45]';

i = 1;
j = 1;
while i < numel(y)+1
     if y(i) == x(j,1)
        a(i,1) = x(j,2);
        i = i + 1;
        j = j + 1;
     else 
        j = j + 1;    
    end
end

a
% check
size(y)
size(a)

Как видите, я сделал вектор x длинным рядом в 2 столбца. Затем я создал подмножество значений вектора y, которое включает точки данных, содержащиеся в векторах x. Я запускаю свой скрипт, размер соответствует y, что означает, что размер получается таким же. Я также увидел, что сама матрица имеет те же значения. Так что это работает. Если только это не упрощенная версия, где я что-то упускаю. В любом случае, мой реальный сценарий ниже.

% Pressure Data
west_time;
west_pressure;
% Weather Data
weather_data(:,1) = weather_time;
weather_data(:,2) = weather_pressure;
% Initialize vector
weather_pressure_sensor = zeros(numel(west_time));

% Obtaining the pressure from the weather data at a 
% particular point in time when it corresponds 
% with the time from my pressure sensor
i = 1;
j = 1;
while i < numel(west_time),
   if west_time(i) == weather_data(j,1)
       weather_pressure_sensor(i,:) = weather_data(j,2);
       i = i + 1;
       j = j + 1;
   else 
       i = i;
       j = j + 1;
   end  
end

% Weather Pressure
weather_pressure_final = weather_pressure_sensor(:,2);

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

Attempted to access weather_data(64009,1); index out of
bounds because size(weather_data)=[64008,2].

Error in data_timeset2 (line 69)
    if west_time(i) == weather_data(j,1)

Мне было интересно, могу ли я получить некоторую помощь с моим кодом. Я что-то упустил или что-то не определил? Так я всегда делал циклы while, поэтому я не знаю, почему он решает подвести меня сейчас. Но в любом случае, я уверен, что это что-то действительно тривиальное и глупое, но я не могу понять, что это за жизнь. А может у кого есть другой способ...? В любом случае заранее очень признателен!


person jejjohnson    schedule 19.01.2013    source источник


Ответы (1)


Если временные точки в вашем наборе данных уникальны, есть гораздо лучший способ сделать это.

t1 = [...]; #% time series 1
t2 = [...]; #% time series 2; is a subset of t1
p1 = [...]; #% pressure series 1; same length as t1
p2 = [...]; #% pressure series 2; same length as t2

[t1, index] = sort(t1); #% make monotonic if it isn't already
p1 = p1(index); #% apply same sorting to pressures
[t2, index] = sort(t2); #% same for t2, p2
p2 = p2(index);

[Lia, Locb] = ismember(t2, t1); #% Lia contains indices of t2 that are in t1
                                #% Locb contains indices of t1 that are in t2
final_p = p1(Locb); #% get the values of p1 where t2 existed in t1
person tmpearce    schedule 20.01.2013
comment
Мне нравится твой метод. Это имеет смысл, и им намного легче управлять. Однако после расследования я обнаружил, что некоторые числа в моем векторе t1_members (Locb) получают нулевые значения. Я понимаю, что ноль представляет собой место, где А не находится в В. Однако, если А является подмножеством В, то нулей быть не должно, верно? - person jejjohnson; 21.01.2013
comment
Поэкспериментируйте с небольшим образцом набора данных, чтобы освоиться с ним. Если A является подмножеством B, то [Lia,Locb]=ismember(A,B) будет иметь Lia все 1, потому что все A находятся в B, а Locb будет вектором индексов той же длины, что и A и find(Lia). Попробуйте изменить порядок аргументов (в небольшом примере) и посмотрите, что произойдет. - person tmpearce; 21.01.2013