2012-11-09 23 views
1

我正在写一个函数,它需要一个我指定为Julian日期的日期的输入向量和一个值的范围(作为向量)。在函数中,我使用预定义的窗口大小来删除数据中的任何nans。例如:当求平均数据时找到合适的窗口大小大小

t = transpose(1/24:1/24:40); 
data1 = 1+(30-1).*rand(length(t),1); 
Randm = floor(1+(length(t)-1).*rand(120,1)); 
data1(Randm) = nan; 
figure(1); 
plot(data1,'linewidth',3); 
hold on; 

dailyData = reshape(data1,40,[]); 
nanMap = isnan(dailyData); 
validValuesPerDay = sum(~nanMap, 2); 
nonNanData = dailyData; 
nonNanData(nanMap) = 0; 
sumPerDay = sum(nonNanData, 2); 
dailyMeans = sumPerDay ./ validValuesPerDay; 
dailyMeans = repmat(dailyMeans, [1 24]); 
repairedData = dailyData; 
repairedData(nanMap) = dailyMeans(nanMap); 
data1 = reshape(repairedData,[],1); 
plot(data1,'--r'); 

是如何应对数据我现在面临的问题是不同分辨率的每小时例如每日或每周,因为这将影响我使用重塑时的代码。有没有人有如何处理这个问题的建议?我正在考虑按照指定窗口大小(这是我使用重塑时的意思)作为数据长度的一部分来做一些事情。

回答

1

通常,您必须为所需的所有不同功能编写单独的例程。例如,如果您获得每日数据,您想做什么?平均数周?两星期?月?年份?

因此,最稳健的选择将是(假设您总能获得线性网格次):

switch t(2)-t(1) 
    case 1/24 % hourly data 
     dailyData = reshape(data1,[], 24); 
     ... etc. 

    case 1 % daily data 
     weeklyData = reshape(data1,[], 7); 
     ... etc. 

    case 7 % weekly data 
     yearlyData = reshape(data1,[], 52); 
     ... etc. 

    otherwise 
     ... issue error 

end 

注意,reshape可能是你需要在交换机做的唯一的事情;其余的代码将保持不变。您可能想重新考虑变量名称,但...