2013-10-18 106 views
1

我需要製作一個scilab/MATLAB程序,用於平均給定大小(N x N x N)的立方體中3D矩陣的值。我始終感謝任何能夠幫助我的人。如何構建平均3D矩陣的Scilab/MATLAB程序?

在此先感謝

+0

'mean(M(:))'其中'M'是矩陣? – Ansari

+0

重疊或不重疊?對於非重疊,使用30x30x30矩陣和5x5x5的立方體,輸出將爲6x6x6。那是你要的嗎? – chappjc

回答

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); 

如果你需要一個全尺寸輸出無線th平均值的複製,有一個簡單的解決方案,其中涉及'UniformOutput'選項cellfun其次是cell2mat

如果你想要重疊立方體和輸入相同的大小輸出,你可以簡單地做convn(A,ones(blockDims)/prod(blockDims),'same')

編輯:簡化,清晰度,通用性和修復。

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循環和複製可一旦你索引的要點被淘汰。