Matlab:每 8 个单元格求和并在这 8 个单元格上除以值

Matlab: sum every 8 cells and divide value over those 8 cells

提问人:user5618251 提问时间:11/18/2023 更新时间:11/18/2023 访问量:32

问:

我有一个大数组,我想对这个数组中的每 8 个单元格求和。然后我想将这 8 个单元格的平均值分配给每个单元格。16 个单元格的示例:

0
0
3.69230000000000
4.54440000000000
0
0
1.20710000000000
0
0
0
0.213020000000000
0
0
0
0
0.355030000000000

将变成:

1.1805
1.1805
1.1805
1.1805
1.1805
1.1805
1.1805
1.1805
0.0710
0.0710
0.0710
0.0710
0.0710
0.0710
0.0710
0.0710

我该怎么做?

谢谢

数组 MATLAB

评论

0赞 Cris Luengo 11/18/2023
当你说“细胞”时,我认为你有一个元胞数组而不是一个数值数组。请添加一些 MATLAB 代码,该代码创建一个示例数组,该数组具有与实际数组相似的属性,以便我们可以确定输入。

答:

4赞 pho 11/18/2023 #1

首先,将数组重塑为数组:8x*

a = [0 0 3.69230000000000 4.54440000000000 0 0 1.20710000000000 0 0 0 0.213020000000000 0 0 0 0 0.355030000000000]';

a_r = reshape(a, 8, []);

然后,计算该数组在第一个轴上的平均值:

m = mean(a_r, 1);

最后,创建一个数组 1,将其乘以 ,并将结果调整为单个列:8x1m

result = reshape(ones(8, 1) * m, [], 1)

(或者,正如 Cris 建议的那样,用于平铺数组:repmatm

result = reshape(repmat(m, 8, 1), [], 1);

这给出了:

   1.180475
   1.180475
   1.180475
   1.180475
   1.180475
   1.180475
   1.180475
   1.180475
   0.071006
   0.071006
   0.071006
   0.071006
   0.071006
   0.071006
   0.071006
   0.071006

评论

1赞 Cris Luengo 11/18/2023
您可以使用代替乘以 。不确定哪个是更干净的代码。repmatones
3赞 Wolfie 11/18/2023 #2

您可以使用来生成每个组的平均值,其中组通过重复每个组 8 次来定义,即块数。splitapply1:NN=numel(a)/8

然后只需将其扩展回与输入相同的大小即可。repelema

m = splitapply( @mean, a, repelem(1:numel(a)/8,1,8).' );
m = repelem( m, 8, 1 );                  

替换您想要的任何聚合函数@mean

你可以用很少的改进使它更通用,这样它就可以处理你的输入不能完全被分成 8 个块的情况。在这种情况下,如果需要,只需使用较小的“剩余”块

g = repelem(1:ceil(numel(a)/8),1,8).';
m = splitapply( @mean, a, g(1:numel(a)) );
m = m(g(1:numel(a)));