对于一个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中条目求和得到的低分辨率矩阵。
例如,B(1,1,1) = A(1:3,1:3,1:3)中所有元素的总和。
基本上,A是一种高分辨率矩阵,而B是从A中条目求和得到的低分辨率矩阵。
A
,并将该标签用作accumarray
的第一个输入参数进行求和。 标签使用从1
到N
的整数,因此accumarray
的结果已经具有所需的形状(N
xN
xN
)。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);
对于一个二维矩阵,这将起作用:
B = reshape(sum(im2col(A, [3 3], 'distinct')), [N N]);
im2col
。您可能需要使用循环。留给读者作为练习 ;)