Binning regions of a 2D matrix slices (and extending this into the third dimension)
5 次查看(过去 30 天)
显示 更早的评论
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 个评论
采纳的回答
Bruno Luong
2020-8-14
编辑:Bruno Luong
2020-8-14
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 个评论
Bruno Luong
2020-8-14
编辑:Bruno Luong
2020-8-14
See argument 'omitnan'of SUM.
Alternatively you can replace NaN by 0
B(isnan(B))=0
before the sum
Matt J
2020-8-14
Bruno's technique is pre-implemented for you in sepblockfun
B=sepblockfun(A,[16,4,1],@(x,d) sum(x,d,'omitnan'))
更多回答(1 个)
Alan Moses
2020-8-14
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!
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Resizing and Reshaping Matrices 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!