Compress down a 1000x1000 matrix into a 100x100 matrix

조회 수: 56 (최근 30일)
Ahmed Abdulla
Ahmed Abdulla 2020년 6월 7일
댓글: larasupernovae 2022년 3월 3일
I have a 1000x1000 matrix that contains various values. I would like to compress it down into a 100 by 100 matrix by averaging each 10 by 10 cell's values into 1, but im not really sure how to go about doing this

채택된 답변

Ameer Hamza
Ameer Hamza 2020년 6월 7일
편집: Ameer Hamza 2020년 6월 7일
If you have image processing toolbox
M = rand(1000, 1000);
M_new = blockproc(M, [10 10], @(x) mean(x.data, 'all'))
Alternative Solution 1: (surprisingly the fastest)
M_new = conv2(M, ones(10)/100, 'valid');
M_new = M_new(1:10:end, 1:10:end);
Alternative Solution 2:
M_C = mat2cell(M, 10*ones(1,100), 10*ones(1,100));
M_new = cellfun(@(x) mean(x, 'all'), M_C);
Alternative Solution 3:
M_new = zeros(size(M)/10);
for i=1:100
for j=1:100
M_new(i, j) = mean(M(10*(i-1)+1:10*i,10*(j-1)+1:10*j), 'all');
end
end
  댓글 수: 2
Robert Jansen
Robert Jansen 2021년 3월 24일
Amazing array of solutions. These all give the same results. The last one is surprisingly fast too. Thanks.
larasupernovae
larasupernovae 2022년 3월 3일
thank you so much!

댓글을 달려면 로그인하십시오.

추가 답변 (2개)

David Hill
David Hill 2020년 6월 7일
count=1;
for col=1:100:1000
for row=1:100:1000
newMatrix(count)=mean(yourMatrix(row:row+99,col:col+99),'all');
count=count+1;
end
end
newMatrix=reshape(newMatrix,10,[]);

Jan
Jan 2021년 3월 24일
편집: Jan 2021년 3월 24일
X = rand(1000, 1000);
Y = reshape(X, [10, 100, 10, 100]);
Z = reshape(sum(sum(Y, 1), 3), [100, 100]) / 100;
Or with FEX: BlockMean :
Z = BlockMean(X, 10, 10)

카테고리

Help CenterFile Exchange에서 Statistics and Machine Learning Toolbox에 대해 자세히 알아보기

태그

제품


릴리스

R2019b

Community Treasure Hunt

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

Start Hunting!

Translated by