如果我有一年的数据
Jday = datenum('2010-01-01 00:00','yyyy-mm-dd HH:MM'):1/24:...
datenum('2010-12-31 23:00','yyyy-mm-dd HH:MM');
dat = rand(length(Jday),1);
并且想计算“dat”的每月平均值,我会使用:
% monthly averages
dateV = datevec(Jday);
[~,~,b] = unique(dateV(:,1:2),'rows');
monthly_av = accumarray(b,dat,[],@nanmean);
但是,我想计算白天发生的点的月平均值,即在 6 小时和 18 小时之间,如何做到这一点?
我可以在每月平均值中分离出我希望使用的时间:
idx = dateV(:,4) >= 6 & dateV(:,4) <= 18;
然后可以通过以下方式更改“b”以仅包含这些点:
b(double(idx) == 0) = 0;
然后计算平均值
monthly_av_new = accumarray(b,dat,[],@nanmean);
但这不起作用,因为 accumarray 只能使用正整数,因此我得到一个错误
使用 accumarray 时出错 第一个输入 SUBS 必须包含正整数下标。
做我概述的事情的最佳方法是什么?请记住,这样做时我不想更改变量“dat”,即在计算平均值之前从“dat”中删除一些值。
考虑一下,最好的解决方案是
monthly_av = accumarray(b(idx),dat(idx),[],@nanmean);