# Averaging elements of a list of matrices over time

Suppose that I have a time series of a matrix, say, for 3 periods.

t1={{0,3,0},{6,0,0},{3,6,0}};
t2={{0,6,0},{3,0,3},{0,6,0}};
t3={{0,3,6},{3,0,6},{3,3,0}};


I want to take the average of each cell [i,j] over time by considering the number of non-zero elements only as follows:

I went through the documentation of Matrix Operations but I could not find any thing close to what I describe above. Of course, one can use Flatten, Sum and Partition to accomplish what I want. However, I like to have a more elegant way to do the job using matrix structure.

Quiet @ Block[{Indeterminate = 0}, Total[#] / Total[Unitize @ #]] & @ {t1, t2, t3}

% // MatrixForm // TeXForm


$$\left( \begin{array}{ccc} 0 & 4 & 6 \\ 4 & 0 & \frac{9}{2} \\ 3 & 5 & 0 \\ \end{array} \right)$$

Also

Total[{t1, t2, t3}] / (Total[Unitize @ {t1, t2, t3}] /. 0 -> 1)


same result

• Your answers are perfect, just the type of answers I was thinking of. The first answer looks more elegant, though. Commented Oct 25, 2018 at 19:28
• Thank you @TugrulTemel for the accept and kind words.
– kglr
Commented Oct 25, 2018 at 19:30
• First solution gives a warning on M11.3 Power::infy: Infinite expression 1/0 encountered. Commented Oct 25, 2018 at 19:34
• Thank you @OkkesDulgerci. Forgot to Quiet.
– kglr
Commented Oct 25, 2018 at 19:39
• @kglr: Yes, I was going to ask why we receive warnings from the first method. There is no room for warning because if all elements are zero, then the average is zero. Commented Oct 25, 2018 at 19:41
Total[{t1, t2, t3}]/Clip[Total[Unitize@{t1, t2, t3}], {1, Infinity}]


You can do it as a pipeline of functions, using MapThread; a properly placed Replace gets rid of the warnings:

MapThread[
List /* DeleteCases[0] /* Replace[{} -> {0}] /* Mean,
{t1, t2, t3}, 2]

(* {{0, 4, 6}, {4, 0, 9/2}, {3, 5, 0}} *)