matlab - 矩阵中四组的总和

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

最佳答案

假设第一列描述了第三列中的哪些值属于哪个组,最简单的方法是将所有零值更改为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 赋值做同样的事情,但您可以避免使用 accumarrayreshape第三列变成四行矩阵然后sum分别在每一行上:

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

关于matlab - 矩阵中四组的总和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34659867/

相关文章:

performance - 列出所有 n 对整数的最快解决方案?

matlab - 在 MATLAB 中定义额外的中缀运算符

algorithm - 找到矩阵中任何矩形之和的最快方法

r - 查找矩阵中重复次数最多的行

无法遍历所有矩阵元素

lisp - 矩阵添加 Lisp

matlab - matlab 中的频谱图 - 时间轴格式

matlab - %#ok<SAGROW> 注释在 MATLAB 中是什么意思?

R中的逐行相关

matlab - 检查类的空实例