Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 基于第一列值获取其他列的和值_Matlab - Fatal编程技术网

Matlab 基于第一列值获取其他列的和值

Matlab 基于第一列值获取其他列的和值,matlab,Matlab,excel文件包含5列;第一列包含年份(1987年至2080年),第二列包含月份,第三列包含天数,第四列和第五列包含值。我想根据第一列中的年份得到第四列和第五列的总和。例如,我想得到1987年、1988年、1989年第四列和第五列的总和,依此类推。! 考虑到每年包含365天,我尝试了以下代码 n=1; for i=1:365:size(data,1) Total(n,:) = sum(data(i:i+365-1,:)); n=n+1; end 但问题是并非所有年份都包含36

excel文件包含5列;第一列包含年份(1987年至2080年),第二列包含月份,第三列包含天数,第四列和第五列包含值。我想根据第一列中的年份得到第四列和第五列的总和。例如,我想得到1987年、1988年、1989年第四列和第五列的总和,依此类推。!

考虑到每年包含365天,我尝试了以下代码

n=1;
for i=1:365:size(data,1)
    Total(n,:) = sum(data(i:i+365-1,:));
    n=n+1;
end
但问题是并非所有年份都包含365天。其中一些(如1988年、1992年)在一年中包含366天,因为它们是闰年。在这些情况下,求和结果变得不正确

请根据第1列中的年份获取第4列和第5列的总和


非常感谢。

更新:最终解决方案速度更快


每列一行可按如下方式进行:

% 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
大小的矩阵,并且对于每一个唯一的年份,它都会对整个矩阵应用索引来“搜索”当前年份,该年份将被汇总。但实际上有一个内置函数正是这样做的:


您可以使用实现更简单、更快的解决方案:


非常感谢@thewaywewalk!!。。。非常感谢您为我们提供其他选择well@shawpnik:请查看我的编辑,我发布了另一个解决方案,它更适合您的需要,而且比订单更快!
[~,~, i_uy] = unique(data(:,1));
C4 = accumarray(i_uy,data(:,4));
C5 = accumarray(i_uy,data(:,5));