Matlab:每8个单元格求和,并将值除以这8个单元格

jjjwad0x  于 7个月前  发布在  Matlab
关注(0)|答案(2)|浏览(72)

我有一个大数组,我想在这个数组中每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


我该怎么做?
谢谢

ldioqlga

ldioqlga1#

首先,将数组整形为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的8x1数组,将其乘以m,并将结果整形为一列:

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


(or正如Cris建议的那样,使用repmat来平铺m数组:

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

py49o6xq

py49o6xq2#

您可以使用splitapply来生成每个组的平均值,其中每个组通过重复1:N 8次来定义,其中N=numel(a)/8是块的数量。
然后使用repelem将其扩展回与输入a相同的大小。

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)));

相关问题