How to compute the mean of several matrices in a cell?

4 views (last 30 days)
Kim Arnold on 30 Sep 2020
Commented: Kim Arnold on 30 Sep 2020
I have 15 matrices (size of each matrix 17x5000) in a type of cell named M_one and size 1x15 {1,15] (matrix 1 would be M_onel{1,1}, matrix 2 would be in M_one{1,2} and so on. I want to sum together always 3 matrices and then calculate the mean of those three matrices. This would look like:
M_onel{1,1}+M_one{1,2} + M_one{1,3}./3 % sum first three matrices and calculate mean by dividing with 3
M_onel{1,4}+M_one{1,5} + M_one{1,6}./3 % same for matrices 4,5 and 6
M_onel{1,7}+M_one{1,8} + M_one{1,9}./3 % same for matrices 7,8 and 9
... % same for matrices 10,11,12 and 13,14, 15
Is there an easier way to do it, for example in a loop? Since I want it to do always for 3 matrices its not easy to do it with a loop.

Stephen23 on 30 Sep 2020
Edited: Stephen23 on 30 Sep 2020
Just for fun, if your memory can handle it:
A = mean(permute(cell2mat(reshape(M_one,1,1,3,[])),[1,2,4,3]),4)
For matrices of that size, a loop will be most efficient, e.g.:
M_one = arrayfun(@(n)randi(17,5000),1:15,'uni',0); % fake data
C = reshape(M_one,3,[]);
N = size(C,2);
D = cell(1,N); % preallocate
for k = 1:N
D{k} = mean(cat(3,C{:,k}),3);
end
Kim Arnold on 30 Sep 2020
Thanks a lot for this nice answer. I prefer the second option, I think my memory was a bit exhausted :)

Ameer Hamza on 30 Sep 2020
An alternative approach. M_one is your 1x15 cell array
M_one = mat2cell(M_one, 1, 3*ones(1, numel(M_one)/3));
M_avg = cellfun(@(x) {mean(cat(3, x{:}), 3)}, M_one);
Kim Arnold on 30 Sep 2020