# How do I calculate a mean value of a vector and ignore from the "0" when appears inside the vectors?

7 views (last 30 days)
Tzahi Shukrun on 24 Sep 2016
Commented: Star Strider on 4 Oct 2016
Hello.
I need to calculate a mean value of a velocity vector. The vector contains a damaged cells which appears as "0" inside the vector. How do I calculate a mean value of a vector and ignore from the "0" when appears inside the vectors?

Star Strider on 24 Sep 2016
If you have a recent release (I don’t remember when the 'omitnan' option appeared) or the Statistics and Machine Learning Toolbox nanmean function you can change the zeros to NaN and use those functions:
V = randi([0 9], 5)
V(V==0)= NaN
Out_1 = nanmean(V)
Out_2 = mean(V, 'omitnan')
V =
0 4 6 0 4
1 5 1 9 3
6 2 3 7 5
7 7 6 4 5
6 1 7 4 8
V =
NaN 4 6 NaN 4
1 5 1 9 3
6 2 3 7 5
7 7 6 4 5
6 1 7 4 8
Out_1 =
5 3.8 4.6 6 5
Out_2 =
5 3.8 4.6 6 5
The problem with the logical indexing approach is that it defaults to ‘linear indexing’ because the rows and columns are no longer equal. That produces a vector argument to the mean function, and the mean of the vector.

Show 1 older comment
Star Strider on 28 Sep 2016
My pleasure!
Actually, not.
Looking at the first column of ‘V’ with the NaN values, the mean with nanmean, or mean with 'omitnan', the mean is:
(1 + 6 + 7 + 6)/4 = 20/4 = 5
the desired result.
With the ‘0’, the mean of that column is:
(0 + 1 + 6 + 7 + 6)/5 = 20/5 = 4
which is not the result you said you want.
So substituting the ‘0’ with NaN and using the appropriate functions produces the correct result.
Tzahi Shukrun on 4 Oct 2016
PERFECT! THANKS!
Star Strider on 4 Oct 2016
My pleasure!

George on 24 Sep 2016
Edited: George on 27 Sep 2016
Replacing the 0s with NaN and using the 'omitnan' flag should do what you want.
>> A
A =
NaN NaN 11.6780 NaN NaN NaN NaN -23.3560 -35.0340 -42.8200
NaN NaN NaN NaN NaN NaN NaN -7.7850 -7.7850 -15.5710
NaN NaN NaN NaN NaN NaN 3.8930 NaN -3.8930 -15.5710
NaN NaN NaN NaN NaN NaN -3.8930 NaN NaN 15.5710
NaN NaN NaN NaN NaN NaN NaN -3.8930 -11.6780 -15.5710
NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
NaN NaN NaN NaN NaN NaN NaN -19.4630 -35.0340 -54.4980
NaN NaN NaN NaN NaN NaN NaN NaN -3.8930 -15.5710
NaN NaN NaN NaN NaN NaN NaN 3.8930 7.7850 11.6780
NaN NaN NaN NaN NaN NaN NaN -3.8930 -11.6780 -19.4630
NaN NaN NaN NaN NaN NaN NaN NaN -3.8930 NaN
NaN NaN NaN NaN NaN NaN NaN -3.8930 -3.8930 -11.6780
NaN NaN NaN NaN NaN NaN NaN -3.8930 -3.8930 -7.7850
NaN NaN NaN NaN NaN NaN NaN NaN -7.7850 -15.5710
NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.7850
Trial>> meanCols = mean(A, 'omitnan')
meanCols =
NaN NaN 11.6780 NaN NaN NaN 0 -7.7854 -10.0562 -13.7742
>>

Tzahi Shukrun on 24 Sep 2016
Hi! Thank you for your help. This command gives me the mean value of the entire matrix. I do i get the mean value of each vector in the matrix?
Tzahi Shukrun on 4 Oct 2016

PERFECT!

THANK YOU VERY MUCH!

Image Analyst on 24 Sep 2016
Edited: Image Analyst on 24 Sep 2016
Try this
meanVelocity = mean(allVelocities(allVelocities ~= 0))

Tzahi Shukrun on 24 Sep 2016
Hi! Thank you for your help. This command gives me the mean value of the entire matrix. I do i get the mean value of each vector in the matrix?
Image Analyst on 24 Sep 2016
No it doesn't. It gives the means of only the non-zero elements of your vector. But now you've changed your question. Now you're saying that you have a matrix, NOT a vector. In that case, I'd use mean with the omitnan option after you've set 0's to nans, exactly what Star showed.
allVelocities(allVelocities == 0) = nan;
meanVelocity = mean(allVelocities, 'omitnan')
Note, in the above, allVelocities is a matrix (as in your comment), not a vector as you originally said. And meanVelocity is the column over rows (that is, going down columns) so you have one mean for every column.
Tzahi Shukrun on 4 Oct 2016
yeah... you are right, I didnt write my question well. Thanks to you, I have my answer!

Jan on 26 Sep 2016
Edited: Jan on 26 Sep 2016
You do not have to replace the zeros by NaNs, because the zeros are neutral for the SUM already:
sum(A, 1) ./ sum(A ~= 0, 1)

Thorsten on 27 Sep 2016
For the sum, but not for the mean.
Jan on 28 Sep 2016
@Thorsten: Exactly. Therefore you divide by the number of non-zeros and not by the number of elements. The posted code does exactly this.