MATLAB - 用于从时间序列中提取特定数据的while循环条件

时间:2013-01-19 23:43:24

标签: matlab sorting while-loop timeserieschart

背景

我有4个数据集:一个是具有时间压力的天气数据,另一个是具有相同的压力传感器数据集; 时间压力。基本上,两者都是时间序列。较长的时间序列是天气数据,其中两个变量具有大约64008个数据点。压力传感器的较短时间序列是51759.您可以说较短的时间序列是较长时间序列的一个子集,其中包含一些缺失的数据点。无论如何,我想要对天气施加压力,但仅限于传感器的时间。

动机

所以基本上,我正在尝试实现一个 while循环,以便每隔等时间pf我的压力传感器,以及是否数据,我将从天气数据中获取压力。我不需要记录天气数据的时间,因为我可以使用压力传感器的时间序列。

示例

为了了解我在说什么,我做了一个示例脚本,它运行得很好。

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)

我想知道我是否可以通过我的代码获得一些帮助。我错过了什么或者我没有定义什么?这是我在循环中总是这样做的方式,所以我不知道为什么它现在决定让我失望。但无论如何,我确信这是一件非常琐碎和愚蠢的事情,但我无法理解我的生活。或者也许有人有另一种方式......?无论哪种方式,提前非常感谢!

1 个答案:

答案 0 :(得分:0)

如果数据集中的时间点是唯一的,那么有一种更好的方法可以做到这一点。

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