2013-01-19 56 views
0

背景MATLAB - 我的用於從時間序列中提取特定數據

while循環條件我有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) 

我在想,如果我能得到我的代碼一些幫助。我錯過了什麼,或者我沒有定義什麼?這是我一直在循環中完成的方式,所以我不知道爲什麼它現在決定讓我失敗。但無論如何,我肯定這是一件非常微不足道的事情,但我無法弄清楚我的生活。或者,也許有人有另一種方式...?無論哪種方式,都非常感謝!

回答

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 
+0

我喜歡你的方法。它很有意義,而且管理起來要容易得多。 但是,經過調查,我發現我的一些數字在我的t1_members向量(Locb)中得到了一些零值。我知道零表示A不在B中。但是,如果A是B的子集,那麼不應該有任何零,是正確的? –

+0

玩一個小樣本數據集以適應它。如果'A'是'B'的一個子集,那麼'[Lia,Locb] = ismember(A,B)'將具有'Lia'全部爲'1',因爲所有'A'都在'B'中,和'Locb'將是一個與'A'和'find(Lia)'長度相同的索引向量。嘗試切換參數的順序(用小例子),看看會發生什麼。 – tmpearce

相關問題