我需要制作一个scilab / MATLAB程序,在给定大小(N x N x N)的立方体中平均3D矩阵的值。我永远感谢任何可以帮助我的人。
提前致谢
答案 0 :(得分:2)
在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')
。
编辑:简化,清晰,通用和修正。
答案 1 :(得分:0)
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循环和复制。