我需要制作一个 scilab / MATLAB 程序来平均给定大小(N x N x N)的立方体中的 3D 矩阵的值。我永远感谢任何可以帮助我的人。
提前致谢
在 MATLAB 中,mat2cell
组建cellfun
一个出色的团队来处理 N 维非重叠块,我认为问题就是这种情况。一个示例场景:
A
= [30x30x30] 数组bd = [5 5 5]
, 立方体的大小B
= [6x6x6] 块数组表示为实现上述目的,解决方案是:
dims = [30 30 30]; bd = [5 5 5];
A = rand(dims);
f = floor(dims./bd);
remDims = mod(dims,bd); % handle dims that are not a multiple of block size
Ac = mat2cell(A,...
[bd(1)*ones(f(1),1); remDims(1)*ones(remDims(1)>0)], ....
[bd(2)*ones(f(2),1); remDims(2)*ones(remDims(2)>0)], ....
[bd(3)*ones(f(3),1); remDims(3)*ones(remDims(3)>0)] );
B = cellfun(@(x) mean(x(:)),Ac);
如果您需要复制平均值的全尺寸输出,则有一个简单的解决方案,其中包括后面的'UniformOutput'
选项。cellfun
cell2mat
如果你想要重叠的立方体和相同大小的输出作为输入,你可以简单地做convn(A,ones(blockDims)/prod(blockDims),'same')
.
编辑:简化、清晰、通用和修复。
N = 10; %Same as OP's parameter
M = 10*N;%The input matrix's size in each dimensiona, assumes M is an integer multiple of N
Mat = rand(M,M,M); % A random input matrix
avgs = zeros((M/N)^3,1); %Initializing output vector
l=1; %indexing
for i=1:M/N %indexing 1st coord
for j=1:M/N %indexing 2nd coord
for k=1:M/N % indexing third coord
temp = Mat((i-1)*N+1:i*N,(j-1)*N+1:j*N,(k-1)*N+1:k*N); %temporary copy
avg(l) = mean(temp(:)); %averaging operation on the N*N*N copy
l = l+1; %increment indexing
end
end
end
一旦掌握了索引的要点,就可以消除 for 循环和复制。