假设第一列描述了第三列中哪些值属于哪个组,最简单的方法是将所有零值更改为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 ];
制作第三列的副本,让我们做一些魔术:
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);