Splitting arrays using loops
Afficher commentaires plus anciens
would there be a way to create a loop for splitting an 8x8 array into seperate 4x4 arrays and then find the mean of each of the 4x4 arrays and place each of the mean values into a new array ?
5 commentaires
Dyuman Joshi
le 10 Août 2023
Do you want (fixed) 4 4x4 array, like top left, top right, bottom left and bottom right?
or do you want (sliding) 4x4 arrays like (row 1-4, col 1-4); (row 1-4, col 2-5) and so on?
A = reshape(1:64,8,8);
M = mean(permute(reshape(A,4,2,4,2),[2,4,1,3]),3:4)
F = @(s) mean(s.data(:));
M = blockproc(A,[4,4],F)
B = conv2(A,ones(4,4));
M = B(4:4:end,4:4:end)/16
Bruno Luong
le 10 Août 2023
Modifié(e) : Bruno Luong
le 10 Août 2023
No need for permute, squeeze does the job just fine and perhaps faster (no data moving around)
A = reshape(1:64,8,8);
M = squeeze(mean(reshape(A,[4 2 4 2]),[1 3]))
"No need for permute, squeeze does the job just fine"
Not really, because SQUEEZE is fragile, unlike PERMUTE. It all looks "fine" ... until one day the user has data which consists of one row of blocks and are then astonished when the output has the wrong orientation:
A = reshape(1:32,4,8)
M = squeeze(mean(reshape(A,[4 1 4 2]),[1 3])) % oops, wrong output
M = mean(permute(reshape(A,4,1,4,2),[2,4,1,3]),3:4) % aaah, much better
M = permute(mean(reshape(A,4,1,4,2),[1,3]),[2,4,1,3]) % also this
SQUEEZE is just like LENGTH: used only by people who like hidden bugs in their code.
Bruno Luong
le 11 Août 2023
Modifié(e) : Bruno Luong
le 11 Août 2023
OP stated clearly he wants average on 8 x 8 matrix not 4 x 8.
But granted if one doesn't like squeeze, in this block average problem use reshape rather than permute for efficienty
A = reshape(1:32,4,8)
M = reshape(mean(reshape(A,[4 1 4 2]),[1 3]), [1 2])
Réponse acceptée
Plus de réponses (0)
Catégories
En savoir plus sur Loops and Conditional Statements dans Centre d'aide et File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!