我有一个数值为的矩阵。
矩阵的第一列是日期,格式为19260701
公关YYYYMMDD
。
矩阵的其他列是序列。
19260702 0.026 0.000 NaN 1.175
19260706 0.009 0.000 NaN 1.842
19260707 1.388 0.001 NaN 9.061
19260708 1.147 0.028 NaN 0.067
19260709 0.604 0.018 NaN 0.000
19260710 7.255 0.020 NaN 0.005
19260712 0.085 0.093 NaN 1.832
19260713 0.163 0.025 NaN 3.897
19260714 1.294 0.545 NaN 0.188
19260715 0.256 0.077 NaN 0.001
19260716 0.001 0.002 NaN 0.018
19260717 0.000 0.015 NaN 1.863
19260719 0.002 0.062 NaN 1.465
19260720 2.761 0.028 NaN 6.453
19260721 1.998 0.067 NaN 0.328
19260722 0.160 0.123 NaN 0.651
19260723 0.009 0.000 NaN 0.001
19260724 0.005 0.000 NaN 0.000
19260726 0.016 0.002 NaN 0.860
19260727 0.022 0.000 NaN 0.329
19260728 0.002 0.001 NaN 0.857
19260729 0.000 0.343 NaN 2.125
19260730 0.002 0.001 NaN 1.265
19260731 0.000 0.000 NaN 0.283
19260802 0.000 0.010 NaN 0.815
19260803 0.000 1.020 NaN 27.701
19260804 0.000 0.197 NaN 4.162
19260805 0.027 0.016 NaN 42.120
19260806 0.046 0.200 NaN 15.163
19260807 0.284 0.004 NaN 0.382
19260809 1.330 0.000 NaN 3.102
19260810 1.066 0.016 NaN 0.035
19260811 0.261 0.119 NaN 0.249
19260812 0.014 0.031 NaN 328.139
19260813 0.024 0.042 NaN 40.248
19260814 0.094 0.047 NaN 1.460
19260816 0.042 0.007 NaN 25.928
是否可以基于月份对矩阵每一列中的值求和?
道歉
在评论之后,
我不只是想按月求和,而是每年月份,即1960年1月,1960年2月等的总和。
答案 0 :(得分:8)
您可以使用unique
来获取每个月的标签,然后使用splitapply
来基于月份标签在其他列中累积值(accumarray
可以工作,但仅适用于一列)。
如果您将2018年4月和2019年4月视为同一个月:
month = mod(floor(data(:,1)/100-1), 100)+1;
[month_name, ~, month_id] = unique(month);
result = splitapply(@sum, data(:,2:end), month_id);
result_with_month = [month_name result];
如果您考虑2018年4月和2019年4月不同月份:
month = floor(data(:,1)/100);
[month_name, ~, month_id] = unique(month);
result = splitapply(@sum, data(:,2:end), month_id);
result_with_month = [month_name result];
带有提供的数据的示例结果:
result =
1.0e+02 *
0.172050000000000 0.014510000000000 NaN 0.345660000000000
0.031880000000000 0.017090000000000 NaN 4.895040000000000
result_with_month =
1.0e+05 *
1.926070000000000 0.000172050000000 0.000014510000000 NaN 0.000345660000000
1.926080000000000 0.000031880000000 0.000017090000000 NaN 0.004895040000000
答案 1 :(得分:5)
这是一个典型的示例,您可以使用表格代替矩阵。
A = [19260702 0.026 0.000 NaN 1.175
...
19260816 0.042 0.007 NaN 25.928];
% Matrix to table conversion
T = array2table(A,'VariableNames',{'DATE','S1','S2','S3','S4'});
% We add a new column "month"
T.MONTH = floor(T.DATE/100);
% varfun can apply a custom function to your table and group the result according
% to one (or more) variable(s)
Result = varfun(@sum,T,'InputVariables',{'S1','S2','S3','S4'},'GroupingVariables','MONTH')
懒家伙选项:
如果您很懒惰并且不想手动添加变量的名称,则还可以使用线性索引:
T = array2table(A) %column name will be 'A1','A2',....
T.MONTH = floor(T{:,1}/100);
Result = varfun(@sum,T,'InputVariables',2:5,'GroupingVariables','MONTH')
标准高尔夫选项
如果您喜欢短代码,则可以缩短参数名称。例如,如果InputVariables
是唯一以I
开头的参数名称,则可以使用I
代替InputVariables
。
Result = varfun(@sum,T,'I',2:5,'G',6)
答案 2 :(得分:-1)
是的。例如,您可以在此处使用accumarray。
使用它可以识别某个值是否属于某个月份,并使用histc函数对其进行“标记”。带有“标签”的值由accumarray函数求和。