33 views (last 30 days)

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.

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.

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

>>

Image Analyst
on 24 Sep 2016

Edited: Image Analyst
on 24 Sep 2016

Try this

meanVelocity = mean(allVelocities(allVelocities ~= 0))

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.

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)

Jan
on 28 Sep 2016

Suraj Sudheer Menon
on 22 Jun 2020

All non zero elements can be stored in another location using logical indexing and mean operation can be performed.

temp=A(A~=0); %stores the non zero values in temp.

ans=sum(temp)/nnz(A) ; %nnz returns number of non zero elements.

Image Analyst
on 22 Jun 2020

But since the sum of any number of zeros is still zero, the sum of A will be the sum of temp. So temp is not necessary, and you'd get the same thing from

ans=sum(A(:))/nnz(A) ;

Opportunities for recent engineering grads.

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

Start Hunting!
## 0 Comments

Sign in to comment.