Effacer les filtres
Effacer les filtres

Compress down a 1000x1000 matrix into a 100x100 matrix

57 vues (au cours des 30 derniers jours)
Ahmed Abdulla
Ahmed Abdulla le 7 Juin 2020
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

Réponse acceptée

Ameer Hamza
Ameer Hamza le 7 Juin 2020
Modifié(e) : Ameer Hamza le 7 Juin 2020
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 commentaires
Robert Jansen
Robert Jansen le 24 Mar 2021
Amazing array of solutions. These all give the same results. The last one is surprisingly fast too. Thanks.
larasupernovae
larasupernovae le 3 Mar 2022
thank you so much!

Connectez-vous pour commenter.

Plus de réponses (2)

David Hill
David Hill le 7 Juin 2020
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 le 24 Mar 2021
Modifié(e) : Jan le 24 Mar 2021
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)

Catégories

En savoir plus sur Statistics and Machine Learning Toolbox dans Help Center et File Exchange

Tags

Produits


Version

R2019b

Community Treasure Hunt

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

Start Hunting!

Translated by