在MATLAB中计算大数据均值的有效方法

时间:2014-08-04 15:31:56

标签: matlab

我有一个先前模拟的输出,它有32872行和1000列。该行表示90年的每日数据,而该列表示90年的不同数据集。我想要做的是分别计算每年的平均值和标准差。例如我正在做的是:

%for year 1
a=mean2(RAINFALL(1:365,:));
b=std2(RAINFALL(1:365,:));

%for year 2
a=mean2(RAINFALL(366:730,:));
b=std2(RAINFALL(366:730,:));
.
.
.
.
%for year 90
a=mean2(RAINFALL(32508:32872,:));
b=std2(RAINFALL(32508:32872,:));

我所做的是每年手动计算所以我必须手动完成大约90次。问题是我有大约100个像这样的数据集。无论如何,我可以通过自动执行此操作或使用MATLAB中的循环或其他任何功能来简化此过程并将输出数据存储在一个矩阵中,例如:

enter image description here

这样我就不必手动完成了吗?我是MATLAB编程的新手,希望MATLAB的专家能够建议我如何有效地解决这个问题。我真的很感谢你的帮助,因为这是我的硕士学位论文项目。  谢谢

3 个答案:

答案 0 :(得分:3)

for循环可以帮助您 -

R = rand(32872,90); % replace this with your rainfall data
startyear = 2010; % according to your comments

% generate array indices
nod = 365*ones(90,1) ... % number of days in each year
    +(mod((startyear:(startyear+89))',4)==0);
ind(:,2) = cumsum(nod);
ind(:,1) = [0; ind(1:end-1,2)]+1;

% find stats
a = zeros(90,1);
b = zeros(90,1);
for ii = 1:90
    yeardata = R(ind(ii,1):ind(ii,2),:);
    a(ii) = mean2(yeardata);
    b(ii) = std2(yeardata);
end

请注意,这里的棘手问题是妥善处理闰年。

如果您没有包含mean2std2的图像处理工具箱,那么

    a(ii) = mean(yeardata(:));
    b(ii) = std(yeardata(:));

答案 1 :(得分:2)

要了解这些年份,我认为利用MATLAB的日期函数是最安全的,这些函数已经知道闰年的所有规则。

data = rand(32872,100); % replace with your data matrix

[nDays,nData] = size(data);

% let MATLAB construct the vector of dates and worry about things like leap
% year.
dayFirst = datenum(2010,1,1);

dayStamp = dayFirst:(dayFirst + nDays - 1);
dayVec = datevec(dayStamp);

year = dayVec(:,1);

uniqueYear = unique(year);

K = length(uniqueYear);

a = nan(1,K);
b = nan(1,K);

for k = 1:K
   % use logical indexing to pick out the year
   currentYear = year == uniqueYear(k);
   a(k) = mean2(data(currentYear,:));
   b(k) = std2(data(currentYear,:));
end

这种方法的优点是它很灵活。如果您的数据集在1月1日没有开始,或者在12月31日没有结束,那么您就不必弄清楚索引。 MATLAB就是为你做的。另一个优点是,如果您想要随后调用类似

的内容,那么您已经拥有了有序年份的列表
errorbar(uniqueYear,a,b)

答案 2 :(得分:0)

For循环实现:

for i=365:365:32872
  a=mean2(RAINFALL(i:i+365-1,:));
  b=std2(RAINFALL(i:i+365-1,:));
end