矩阵中四个组的总和

时间:2016-01-07 16:09:14

标签: 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    

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

1   NaN
2   NaN
3   NaN
4   NaN
5   8330

1 个答案:

答案 0 :(得分:8)

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

我将假设您的矩阵存储在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 ];

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

col = X(:,3);
col(col == 0) = NaN;
out = accumarray(X(:,1), col);

我们得到:

out =

         NaN
         NaN
         NaN
         NaN
        8330

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

但是,如果您的矩阵保证具有每个组由连续的4元组元素组成的顺序,则可以使用NaN分配执行相同的操作,但您可以避免使用accumarray并将reshape第三列分成四行矩阵,然后逐行sum

col = X(:,3);
col(col == 0) = NaN;
out = sum(reshape(col, 4, []), 1);