提问人:user5618251 提问时间:11/18/2023 更新时间:11/18/2023 访问量:32
Matlab:每 8 个单元格求和并在这 8 个单元格上除以值
Matlab: sum every 8 cells and divide value over those 8 cells
问:
我有一个大数组,我想对这个数组中的每 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
我该怎么做?
谢谢
答:
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,将其乘以 ,并将结果调整为单个列:8x1
m
result = reshape(ones(8, 1) * m, [], 1)
(或者,正如 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
评论
1赞
Cris Luengo
11/18/2023
您可以使用代替乘以 。不确定哪个是更干净的代码。repmat
ones
3赞
Wolfie
11/18/2023
#2
您可以使用来生成每个组的平均值,其中组通过重复每个组 8 次来定义,即块数。splitapply
1:N
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)));
评论