조회 수: 6(최근 30일)
simone zappalà
simone zappalà 2022년 5월 10일
답변: Image Analyst 2022년 5월 10일
I've a 252*51 array, i want to group it three-by-three elements and do mean of these groups one-by-one, creating a new array 84*51 which every row is the mean of three elements of the first array

채택된 답변

dpb 2022년 5월 10일
One of those cases where the optimal way depends upon being familiar with internal array storage order being column-major and manipulation of orientation/shape to take advantage of vector operations --

추가 답변(2개)

Prakash S R
Prakash S R 2022년 5월 10일
편집: Prakash S R 2022년 5월 10일
A more "arithmetic" approach:
So you want to take a 252x51 matrix X and produce a 84x51 matrix Y, right? I would suggest premultiplying X with a 84x252 matrix A that sums successive rows with weights of 1/3.
Thus, Y = (1/3)*A*X, where A has the form
[1 1 1 0 0 0 0 0 0 0 0....
0 0 0 1 1 1 0 0 0 0 0...
0 0 0 0 0 0 1 1 1 0 0 ...
0 0 0 ... 1 1 1]
You can construct A using
aa = [[1 1 1], zeros(1,249)];
Atmp = triu(toeplitz(aa));
A = Atmp(1:3:end, :);

Image Analyst
Image Analyst 2022년 5월 10일
One way is to use blockproc(). It's in the Image Processing Library.
meanFilterFunction = @(theBlockStructure) mean(; % Define mean function.
blockSize = [3, 3]; % Whatever window size you want.
% Get an output image where each pixel is the average of a 3x3 window in
% the original image.
blockyImage = blockproc(grayImage, blockSize, meanFilterFunction);
I'm attaching a script with several ways to use it. Adapt as needed.


Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by