1

我需要制作一个 scilab / MATLAB 程序来平均给定大小(N x N x N)的立方体中的 3D 矩阵的值。我永远感谢任何可以帮助我的人。

提前致谢

4

2 回答 2

2

在 MATLAB 中,mat2cell组建cellfun一个出色的团队来处理 N 维非重叠块,我认为问题就是这种情况。一个示例场景:

  • [输入]: A= [30x30x30] 数组
  • [IN]: bd = [5 5 5], 立方体的大小
  • [OUT]: 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'选项。cellfuncell2mat

如果你想要重叠的立方体和相同大小的输出作为输入,你可以简单地做convn(A,ones(blockDims)/prod(blockDims),'same').

编辑:简化、清晰、通用和修复。

于 2013-10-18T04:04:37.403 回答
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 循环和复制。

于 2013-10-18T02:58:05.187 回答