在MATLAB中不使用for循环计算列中某些行的总和(基于uniqId)

在MATLAB中不使用for循环计算列中某些行的总和(基于uniqId),matlab,sum,Matlab,Sum,我有一个矩阵: raw = [ 2001 1000 ; 2001 2000 ; 2001 1000 ; 2001 1000 ; 2001 2000 ; 5555 nan ; 5555 10000 ; 5555 20000 ; 5555 5000 ; 5555 20000 ; 5555 30000 ; 7777 1000 ; 7777 2000 ; 7777 3000 ; 7777 nan] ; 我需要根据Col1中的uniqId找到Col2中最后4行的总和(对于每个uniqId)。Col2中也

我有一个矩阵:

raw = [ 2001 1000 ; 2001 2000 ; 2001 1000 ; 2001 1000 ; 2001 2000 ; 5555 nan ; 5555 10000 ; 5555 20000 ; 5555 5000 ; 5555 20000 ; 5555 30000 ; 7777 1000 ; 7777 2000 ; 7777 3000 ; 7777 nan] ;
我需要根据Col1中的uniqId找到Col2中最后4行的总和(对于每个uniqId)。Col2中也可能含有NAN。我想要的答案是:

[2001 nan; 2001 nan; 2001 nan; 2001 5000; 2001 6000; 5555 nan; 5555 nan; 5555 nan; 5555 nan; 5555 55000; 5555 75000; 7777 nan 7777 nan 7777 nan ; 7777 nan] ;

原始矩阵只有>=4行数据的元素。我不能使用for循环。如果可能的话,请给我一个矢量化的表格。如果需要,我可以使用while循环。

查看accumarray,这可能会有所帮助。

您可以使用函数和。以下假设每个组至少有4个元素。原始数据中存在的任何
NaN
值将导致包含该值的求和窗口的值为
NaN

[~,~,index] = unique(raw(:,1));  %# Get the indices for the unique values
sumFcn = @(x) {sum(hankel([nan(3,1); x(1:numel(x)-3)],...  %# Anonymous function
                          x(numel(x)-3:end)),2)};          %#   to get the sum
                                                           %#   over each window
                                                           %#   of four values
sumPerID = accumarray(index,raw(:,2),[],sumFcn);  %# Compute the windowed sum
                                                  %#   for each unique ID
raw(:,2) = vertcat(sumPerID{:})  %# Place the results back into the second
                                 %#   column of raw
raw =

        2001         NaN
        2001         NaN
        2001         NaN
        2001        5000
        2001        6000
        5555         NaN
        5555         NaN
        5555         NaN
        5555         NaN
        5555       55000
        5555       75000
        7777         NaN
        7777         NaN
        7777         NaN
        7777         NaN

如果不是作业:为什么不能用for循环,而用while循环?@John-不,John。我在工作中需要它。我可以用SQL对数据进行操作,然后将其与其他内容一起传输到matlab。但是要转移5万行*13列需要很多时间!我随身带着数据。我需要一个矢量化的形式,我找不到自己。Thnx@Andrew-我知道在这里使用“for”循环是比较明智的。然而,我的不情愿是因为巨大的数据量。我可以初始化向量以节省时间。我仍然更喜欢使用矢量化的形式。任何帮助都将不胜感激!Loren写了一篇关于的文章。这个gnovice还有一个主要问题——如果有任何NaN数据,计算就会失败:即如果原始=[2001 1000;2001 2000;2001 1000;2001 1000;2001 2000;5555 NaN;5555 10000;5555 20000;5555 5000;5555 20000;5555 30000];结果是5555次失败。你能修一下吗?非常感谢,一如既往@麦迪:你没有提到原始数据中可能有南。你应该编辑这个问题来提及这点。@gnovice-对不起。我已经相应地编辑了主Q。我最初假设数据中的任何nan都会简单地将最终答案作为nan,因此没有将其包括在Q中。到目前为止,Q是准确的。Thanks@Maddy:我已经更新了我的答案,使之与问题中的新描述和数据相匹配。@gnovice:很遗憾,我无法再次对您使用
hankel
的解决方案进行投票。