我有以下矩阵:第一列是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)
假设第一列描述了第三列中哪些值属于哪个组,最简单的方法是将所有零值更改为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分配,但你可以尽量避免使用accumarray和reshape第三列的四个列的矩阵,然后sum在每个单独排:
col = X(:,3);
col(col == 0) = NaN;
out = sum(reshape(col, 4, []), 1);
Run Code Online (Sandbox Code Playgroud)