我有以下矩阵:第一列是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
答案 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);