Binning regions of a 2D matrix slices (and extending this into the third dimension)
    6 visualizaciones (últimos 30 días)
  
       Mostrar comentarios más antiguos
    
    Eunan McShane
 el 11 de Ag. de 2020
  
    
    
    
    
    Editada: Bruno Luong
      
      
 el 14 de Ag. de 2020
            Hello,
I am having an issue binning regions of a 3D matrix (but I want the binning to occur in the X-Y dimension for each Z slice). Let's say I have a matrix of 512x128x1200, each 2D slice has dimension 512x128, but say I want to bin the pixel counts such that we create a 2D sliced 32x32 matrix (each element being the sum of 16x4 regions within the original larger matrix, is this possible? Then if we can perform this binning in 2D I want to extend this to each element in the Z-direction
It also would be nice then in future to have control of the X/Y bin 'width' so that the matrix can be reshaped into other square orientations, I have just chosen 32x32 as an arbritary starting point!
Hopefully that makes sense!
Cheers
0 comentarios
Respuesta aceptada
  Bruno Luong
      
      
 el 14 de Ag. de 2020
        
      Editada: Bruno Luong
      
      
 el 14 de Ag. de 2020
  
      This assumes the first/second dimensions of your matrix are divisible by 32
% Test matrix
A=rand(512,128,1200);
binsz = 32;
[m,n,p] = size(A);
mr = m/binsz;
nr = n/binsz;
B = reshape(A,mr,binsz,nr,binsz,p);
B = sum(B,[1 3]);
B = reshape(B,binsz,binsz,p);
3 comentarios
  Bruno Luong
      
      
 el 14 de Ag. de 2020
				
      Editada: Bruno Luong
      
      
 el 14 de Ag. de 2020
  
			See argument 'omitnan'of SUM. 
Alternatively you can replace NaN by 0
B(isnan(B))=0
before the sum
  Matt J
      
      
 el 14 de Ag. de 2020
				Bruno's technique is pre-implemented for you in sepblockfun
B=sepblockfun(A,[16,4,1],@(x,d) sum(x,d,'omitnan'))
Más respuestas (1)
  Alan Moses
    
 el 14 de Ag. de 2020
        Hi Eunan,
You can use the convn  function to help you achieve this. Please look at the below example where I have taken ‘X’ as the large matrix and reshaped it into a smaller matrix ‘Z’:
X = 2*ones(512,128,3);
x_width = 16;
y_width = 4;
Y = convn(X,ones(x_width,y_width),'valid');
Z = Y(1:x_width:end,1:y_width:end,:); %Z dimensions – 32x32x3
  Hope this helps!
Ver también
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!



