0

我观察到需要与生成的每月数据进行比较的每日数据,因此我需要获得三十年期间每个月的平均值。

我观察到的数据集目前是 365x31 的,其中行是每天(没有闰年!),额外的列是月份数(1-12)。

我遇到的问题是我似乎只能得到一个脚本来获得所有年份的平均值。IE。我无法弄清楚如何让脚本分别为每一列执行此操作。数据示例如下:

1    12    14
1    -15   10
2    13    3
2    2     37
...all the way to 12 for 365 rows

SO:回顾一下,我需要得到 [12; -15;13; 2] 然后 [14; 10个;3;37] 等等。

我一直在尝试使用 unique() 函数来循环遍历它可以使行数平均但不正确。现在我需要它每个月(28-31 行)和列单独执行。结果应该是一个 12x30 矩阵。我觉得我错过了一些简单的东西。代码:

u = unique(m); %get unique values of m (months) ie) 1-12

for i=1:length(u)
   month(i) = mean(obatm(u(i), (2:31)); % the average for each month of each year
end

欣赏任何想法!谢谢!

4

1 回答 1

2

您可以简单地过滤每个月的行,然后应用mean,如下所示:

month = zeros(12, size(obatm, 2));
for k = 1:12
    month(k, :) = mean(obatm(obatm(:, 1) == k, :));
end

编辑:
如果你想要一些花哨的东西,你也可以这样做:

cols = size(obatm, 2) - 1;
subs = bsxfun(@plus, obatm(:, 1), (0:12:12 * (cols - 1)));
vals = obatm(:, 2:end);
month = reshape(accumarray(subs(:), vals(:), [12 * cols, 1], @mean), 12, cols)

看,妈,没有循环!

于 2013-01-31T20:53:16.633 回答