繁体   English   中英

对3D矩阵中的块求和 - MATLAB

[英]Sum over blocks in a 3D matrix - MATLAB

对于3N乘3N乘3N矩阵A,我想得到一个N乘N乘N矩阵B,其条目来自A中块的求和。

例如,B(1,1,1)= A的所有元素的总和(1:3,1:3,1:3)。

基本上,A是一种高分辨率矩阵,B是对A中条目求和的低分辨率矩阵。

如果不考虑内存,可以使用“标记”方法:构建一个3分量标签来对A的元素进行分组,并使用该标签作为accumarray的第一个输入参数来进行总和。 标签使用从1N整数,因此accumarray的结果已经具有所需的形状( N x N x N )。

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

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

对于2D矩阵,这将起作用:

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

注意:您需要图像处理工具箱。

但对于3D矩阵,我不知道任何与im2col等效的内置函数。 您可能必须使用循环。 作为练习留给读者;)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM