在 MATLAB 中对 3D 矩阵中的块进行求和

3
对于一个3N x 3N x 3N的矩阵A,我想得出一个N x N x N的矩阵B,其条目来自于A中块的求和。
例如,B(1,1,1) = A(1:3,1:3,1:3)中所有元素的总和。
基本上,A是一种高分辨率矩阵,而B是从A中条目求和得到的低分辨率矩阵。

你想让你的代码有多通用?你尝试过在“sum”的“sum”上使用“sum”吗? - Schorsch
这里有一个关于这里提供的工作解决方案的小基准测试 - https://ideone.com/8xeqm7,看一下吧! :) - Divakar
3个回答

3
如果内存不是问题,您可以使用“标记”方法:构建一个3组件标签来分组元素A,并将该标签用作accumarray的第一个输入参数进行求和。 标签使用从1N的整数,因此accumarray的结果已经具有所需的形状(NxNxN)。
N = 5;
F = 3; %// block size per dimension
A = rand(15,15,15); %// example data. Size FN x FN x FN
[ii jj kk] = ind2sub(size(A), 1:numel(A));
label = ceil([ii.' jj.' kk.']/F);
result = accumarray(label, A(:));

@Simon 你并不孤单 :-) 谢谢! - Luis Mendo
@Simon - 不,绝对不是孤单一人! - rayryeng

2

reshape + sum 是一种高效的方法,因此必须非常有效率 -

sumrows = sum(reshape(A,3,[]),1);                      %// Sum along rows
sumcols = sum(reshape(sumrows,N,3,[]),2);              %// Sum along cols
B = reshape(sum(reshape(sumcols,N*N,3,[]),2),N,N,N);   %// Sum along 3rd dim

如果您热衷于单行代码,以下是将所有步骤合并为一个的方法 -

B = reshape(sum(reshape(sum(reshape(sum(reshape(A,3,[]),1),N,3,[]),2),N*N,3,[]),2),N,N,N);

1
比我的更省内存 +1 - Luis Mendo

0

对于一个二维矩阵,这将起作用:

B = reshape(sum(im2col(A, [3 3], 'distinct')), [N N]);

注意:您需要图像处理工具箱。
但是对于3D矩阵,我不知道是否有任何内置函数等效于im2col。您可能需要使用循环。留给读者作为练习 ;)

是的,对于3D来说,看起来你需要循环:https://dev59.com/wmbWa4cB1Zd3GeqPU0Xv - Simon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接