矩阵中四个组的总和

jon*_*345 3 matlab matrix

我有以下矩阵:第一列是1到5的值,第二列是1到20,第三列是随机值.

1   1   2545
1   2   0
1   3   0
1   4   0
2   5   0
2   6   0
2   7   231
2   8   54587
3   9   41
3   10  1111
3   11  0
3   12  1213
4   13  0
4   14  0
4   15  0
4   16  0
5   17  898
5   18  6887
5   19  522
5   20  23    
Run Code Online (Sandbox Code Playgroud)

我想要做的是当所有值都不为零时,以四个为一组得到总和.作为一个例子,在矩阵中我想要的输出是:

1   NaN
2   NaN
3   NaN
4   NaN
5   8330
Run Code Online (Sandbox Code Playgroud)

ray*_*ica 8

假设第一列描述了第三列中哪些值属于哪个组,最简单的方法是将所有零值更改为NaN,然后用于accumarray对属于每个组的所有值求和.这是至关重要的,因为只要对矩阵/数组进行求和,任何值都是NaN,结果就是NaN.这很好,因为如果对每个组求和,如果组NaN中的至少一个值在更改之前等于0 ,则会得到结果.

我将假设您的矩阵存储方式X如下:

X = [1   1   2545
1   2   0
1   3   0
1   4   0
2   5   0
2   6   0
2   7   231
2   8   54587
3   9   41
3   10  1111
3   11  0
3   12  1213
4   13  0
4   14  0
4   15  0
4   16  0
5   17  898
5   18  6887
5   19  522
5   20  23 ];
Run Code Online (Sandbox Code Playgroud)

制作第三列的副本,让我们做一些魔术:

col = X(:,3);
col(col == 0) = NaN;
out = accumarray(X(:,1), col);
Run Code Online (Sandbox Code Playgroud)

我们得到:

out =

         NaN
         NaN
         NaN
         NaN
        8330
Run Code Online (Sandbox Code Playgroud)

这种方法的好处在于,矩阵中每个值的组ID不必按照您在帖子中的顺序排列.


然而,如果你的矩阵保证具有其中每个组由元素连续4元组的顺序,你可以做的同样的事情NaN分配,但你可以尽量避免使用accumarrayreshape第三列的四个列的矩阵,然后sum在每个单独排:

col = X(:,3);
col(col == 0) = NaN;
out = sum(reshape(col, 4, []), 1);
Run Code Online (Sandbox Code Playgroud)