2013-01-19 2 views
0

배경MATLAB - 시계열에서

을 특정 데이터를 추출하는 제 동안 루프 조건 I 4 개 데이터 세트를 가지고는 : 하나 시간압력와 기상 데이터이고 다른 하나는 압력 센서 데이터 세트 인 같은. 시간압력. 근본적으로 둘 다 시계열입니다. 더 긴 시계열은 두 변수에 대해 약 64008 개의 데이터 포인트를 갖는 기상 데이터입니다. 압력 센서의 더 짧은 시계열은 51759입니다. 짧은 시계열은 누락 된 데이터 요소가있는 긴 시계열의 하위 집합이라고 말할 수 있습니다. 그럼에도 불구하고 날씨에 대한 압력을 받고 싶지만 내 센서의 시간에만 압력을 받고 싶습니다.

동기 그러니까 기본적으로, 내가 구현하려고 오전 그래서 루프마다 해당 시간 내 압력 센서 PF 및 데이터인지, 나는 날씨 데이터로부터 압력을 취할 것입니다 동안. 날씨 데이터에서 시간을 기록 할 필요가 없습니다. 압력 센서의 시간 순서를 사용할 수 있기 때문입니다. A를

내가 무슨 말을하고 어떤 아이디어를 얻을, 나는 샘플 스크립트를했고, 그것을 잘 실행됩니다. 당신이 볼 수 있듯이

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) 

, 나는 2 열에서 긴 시리즈와 X의 벡터를했다. 그리고 나서 x 벡터에 포함 된 데이터 요소를 포함하는 벡터 y 값의 부분 집합을 만들었습니다. 나는 스크립트를 실행합니다. 크기는 성냥 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 루프를 수행 한 방식이므로 지금은 나를 실패하게 만드는 이유를 모르겠습니다. 그러나 어쨌든, 나는 그것이 정말로 사소하고 어리석은 것이라고 확신하지만 나는 내 삶을 알 수 없다. 아니면 다른 사람이 ... 어느 쪽이든, 많이 미리 감사!

답변

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)의 일부 숫자에 대해 0 값을 얻는 것을 발견했습니다. 나는 0이 A가 B에없는 것을 나타냅니다. 그러나 A가 B의 하위 집합이면 어떤 0도 없어야합니다. 맞습니까? –

+0

작은 샘플 데이터 세트를 사용하여 편안하게 작업하십시오. 'A'가'B'의 부분 집합이라면''Lia''는'B'에 있기 때문에''Lia''는 모두''1''이 될 것입니다. 'Locb'는'A'와'find (Lia)'와 같은 길이의 인덱스 벡터입니다. 인수의 순서를 바꾸고 (작은 예제 사용) 무슨 일이 일어나는지보십시오. – tmpearce