我有以下矩阵:第一列是 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
最佳答案
假设第一列描述了第三列中的哪些值属于哪个组,最简单的方法是将所有零值更改为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);
关于matlab - 矩阵中四组的总和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34659867/