【问题标题】:Efficient way to calculate mean for huge data in MATLAB在 MATLAB 中计算海量数据均值的有效方法
【发布时间】:2014-08-05 00:45:04
【问题描述】:

我有一个先前模拟的输出,它有 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中的其他任何函数来简化此过程并将输出数据存储在一个矩阵中,例如:

这样我就不必手动操作了?我是 MATLAB 编程的新手,希望 MATLAB 专家可以建议我如何有效地解决这个问题。我非常感谢您的帮助,因为这是我的硕士论文项目。 谢谢你

【问题讨论】:

  • 第一年是哪一年?此信息对于了解每年的天数是必要的。
  • @DanielF.如果你问的话,第一年将是 2010 年。
  • 第一个值是 2010 年 1 月 1 日吗?
  • @craigim 是的,2010 年 1 月 1 日,最后的数据是 2099 年 12 月 31 日。

标签: matlab


【解决方案1】:

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(:));

【讨论】:

  • 所以你想找到一个单一的数字,它是365x1000 数字的平均值/标准?
  • 是的。如果我将 2010 年用作我的第一年,我是否必须对您提供的代码进行任何更改?
  • 我已经更新了我的答案;见编辑。说真的,mean2std2 是用于图像处理的,只包含在图像处理工具箱中。如果您愿意,可以使用它们,但我建议mean(mean(yeardata))
  • 如果您只想了解一切,请使用mean(yeardata(:)) 保存对mean 的调用。
【解决方案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)

【讨论】:

  • 是否可以使用此代码完成每年数据集的计算总和?为简单起见,第 1-365 行是第一年,第 1-1000 列是当年的数据集,我想要的是每一列的 sum(1:365),所以答案将是 1000 列,一行。我试图操纵上面的代码,但我无法成功并发生错误。如果你也能帮助我,我将非常感激。
【解决方案3】:

For循环实现:

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

【讨论】:

  • 我得到索引超出矩阵尺寸错误,“a=mean2(RAINFALL(i:i+365-1,:)); 供您参考,我将 2010 年用作我的第一年。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-04
  • 2012-01-02
  • 2014-06-26
  • 1970-01-01
  • 2015-11-16
  • 1970-01-01
相关资源
最近更新 更多