How can I average multiple matrices by element, ignoring NaN values, to create a new matrix of the same size?

7 ビュー (過去 30 日間)
I have 248 matrices, each of size 72x144. There are some NaN values inserted randomly here and there in these matrices. I would like to create a new matrix, also of size 72x144, which is an average by element of the originals, but ignoring the NaN values. For example:
Original:
matrixA = [2 3 5 | 3 NaN 1 | 2 4 3]
matrixB = [3 4 NaN | 1 2 5 | NaN 3 5]
matrixC = [NaN 2 3 | 2 5 3 | 1 2 1]
Want:
matrixAvg = [2.5 3 4 | 2 3.5 3 | 1.5 3 3]
Is there a simple way for me to do this?
  4 件のコメント
Vivek Selvam
Vivek Selvam 2013 年 10 月 16 日
Does your matrix have any element as zero?
Patrick
Patrick 2013 年 10 月 16 日
There are no elements as zero, only NaN.

サインインしてコメントする。

採用された回答

Yannick
Yannick 2013 年 10 月 16 日
Hi, if you have Statistics Toolbox, you can use nanmean as follows:
matrixA = [2 3 5 ; 3 NaN 1 ; 2 4 3];
matrixB = [3 4 NaN ; 1 2 5 ; NaN 3 5];
matrixC = [NaN 2 3 ; 2 5 3 ; 1 2 1];
allData = cat(3,matrixA,matrixB,matrixC);
nanmean(allData,3);
  2 件のコメント
Patrick
Patrick 2013 年 10 月 16 日
Thank you so much, that worked immediately!
Jerry Gregoire
Jerry Gregoire 2015 年 4 月 14 日
You can also use mean with 'omitnan'
S = mean(..., MISSING) specifies how NaN (Not-A-Number) values are
treated. The default is 'includenan':
'includenan' - the mean of a vector containing NaN values is also NaN.
'omitnan' - the mean of a vector containing NaN values is the mean
of all its non-NaN elements. If all elements are NaN,
the result is NaN.

サインインしてコメントする。

その他の回答 (1 件)

Azzi Abdelmalek
Azzi Abdelmalek 2013 年 10 月 16 日
編集済み: Azzi Abdelmalek 2013 年 10 月 16 日
Edit
matrixA = [2 3 5 ; 3 NaN 1 ; 2 4 3]
matrixB = [3 4 NaN ; 1 2 5 ; NaN 3 5]
matrixC = [NaN 2 3 ; 2 5 3 ; 1 2 1]
A={matrixA matrixB matrixC}
B=cat(3,A{:})
idx=find(isnan(B))
C=ones(size(B));
C(idx)=0;
B(idx)=0;
out=sum(B,3)./sum(C,3)
  8 件のコメント
Azzi Abdelmalek
Azzi Abdelmalek 2013 年 10 月 16 日
編集済み: Azzi Abdelmalek 2013 年 10 月 16 日
The code replace NaN by zeros, but when calculating the mean, it is ignored, for example
[ nan 2 3] % is replaced by
[0 2 3]
% to calculate the mean
sum([0 2 3])./sum([0 1 1]) % =5/2=2.5
Patrick
Patrick 2013 年 10 月 16 日
Thank you for your help Azzi, I have solved the problem.

サインインしてコメントする。

カテゴリ

Help Center および File ExchangeLogical についてさらに検索

Community Treasure Hunt

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

Start Hunting!

Translated by