更新:最终更快的解决方案!
可以如下实现,每列一行:
% some example data
years = ceil(1987:0.3:2080)';
months = randi(12,numel(years),1);
days = randi(30,numel(years),1);
values = randi(42,numel(years),2);
% data similar to yours;
data = [ years months days values ];
这将是一种易于阅读的方式:
% years
y = data(:,1)
% unique years
uy = unique(y);
% for column 4
C4 = arrayfun(@(x) sum( data(y == x, 4) ), uy )
% for column 5
C5 = arrayfun(@(x) sum( data(y == x, 5) ), uy )
或者每列只写一行:
C4 = arrayfun(@(x) sum( data( (data(:,1) == x), 4) ), unique(data(:,1)) )
返回一个 94x1 双精度数组,其中包含示例数据的所有 94 个唯一年份的所有总和。
如果你想以某种方式安排它,你可以这样做:
summary = [uy, C4, C5]
返回类似:
summary = %//sum of sum of
column 4 column 5
1987 3 3
1988 40 40
1989 56 56
1990 96 96
1991 54 54
1992 15 15
1993 73 73
1994 42 42
1995 66 66
1996 56 56
...
您也可以一次完成所有列。已经只有 2 列,它应该快 50%。
cols = 4:5;
C = cell2mat( arrayfun(@(x) sum( data(y == x, cols),1 ), uy,'uni',0 ) )
该解决方案的问题在于,您有一个大小约为30000x5 的矩阵,并且对于每个唯一年份,它将对整个矩阵应用索引以“搜索”当前年份的总和。但实际上有一个内置函数可以做到这一点:
您可以使用accumarray:
实现更简单、更快速的解决方案
[~,~, i_uy] = unique(data(:,1));
C4 = accumarray(i_uy,data(:,4));
C5 = accumarray(i_uy,data(:,5));