如何构建平均3D矩阵的Scilab / MATLAB程序?

时间:2013-10-18 02:42:26

标签: matlab matrix 3d average scilab

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

提前致谢

2 个答案:

答案 0 :(得分:2)

在MATLAB中,mat2cellcellfun组成了一个很好的团队来处理N维非重叠块,正如我认为的那样。示例场景:

  • [IN]: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'后跟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循环和复制。