2013-06-10 2 views
3

Я измерил несколько переменных с интервалом в 30 минут. Штампы времени доступны в формате datevec или datenum. Я хочу рассчитать ...MATLAB: Усреднение временных рядов данных без циклов?

a) ... среднесуточные и
b) ... средние значения в момент времени x, т.е. температура в 11:30, температура в 12:00 и т. д., усредненная по всему нашему набору данных.

В то время как это более или менее легко выполняется с помощью петель, мне интересно, есть ли более простой/удобный способ работы с временными рядами, поскольку это довольно простая задача в конце концов?

/редактировать 1: По запросу: click me for sample data

+2

Я могу предоставить решение с 'accumarray()', если вы публикуете некоторые данные примера. – Oleg

+0

Надеюсь, что 100 измерений достаточно: [нажмите мне для примера данных] (https://dl.dropboxusercontent.com/u/9437411/sampledata_ts.mat) –

ответ

6

Учитывая, что datevec() выход хранится в tvec, и данные в x, группу с unique(...,'rows') и накапливают с accumarray():

% Group by day 
[unDates, ~, subs] = unique(tvec(:,1:3),'rows'); 

% Accumulate by day 
[unDates accumarray(subs, x, [], @mean)] 

% Similarly by hour 
[unHours, ~, subs] = unique(tvec(:,4:5),'rows'); 
[unHours accumarray(subs, x, [], @mean)] 
+0

+1: любое действующее решение с 'accumarray' заслуживает этого! Этому ребенку следует как можно больше повысить :) –

+0

Очень элегантное решение, спасибо большое. –

Смежные вопросы