Daily values to Monthly Means for Multiple Years Matlab
我观察到了需要与生成的每月数据进行比较的每日数据,因此我需要获取 30 年期间每个月的平均值。
我观察到的数据集目前是 365x31 的,每一天都是行(没有闰年!),额外的一列是月份数 (1-12)。
我遇到的问题是我似乎只能得到一个脚本来获得所有年份的平均值。 IE。我无法弄清楚如何让脚本分别为每一列执行此操作。数据示例如下:
1 2 3 4 5
| 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 矩阵。我觉得我错过了一些简单的东西。代码:
1 2 3 4 5
| 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 |
欣赏任何想法!谢谢!
- 所以我不明白,在您的数据上应用 mean 有什么问题?你到底想做什么?
-
mean(A) 只会给我整个专栏,我需要它在每个月之后停止。这就是我从该代码中尝试的。但就像我说的,简单的事情?
您可以简单地过滤每个月的行,然后应用 mean,如下所示:
1 2 3 4
| month = zeros(12, size(obatm, 2));
for k = 1: 12
month (k, : ) = mean(obatm (obatm (:, 1) == k, : ));
end |
编辑:
如果你想要一些花哨的东西,你也可以这样做:
1 2 3 4
| 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 ) |
看,妈妈,没有循环!