Subtract two matrices each with NaN values in different cells?

Hello,
I am a complete beginner at matlab. I want to calculate how many cells in two matrices match i.e. how many cells in matrix A and matrix B both contain a value. However, I run into problems with 0 values. If I simply subtract the two matrices, matlab won't make a calculation if one of the cells in A or B is NaN which I need it to. Is there a way to tell matlab to use NaN as 0 if the corresponding cell in the other matrix has a value>0? I also need to be the output matrix to show if the subtraction of the two cells produces a 0 i.e. both cells contained a value but were of equal value so matlab returns a 0 and thus it wouldn't be counted as a match. Put simply, I need to be able to distinguish between a case where there is no value in a specific cell in either A and B versus when the specific cell in A and B are equal in value and thus return a 0 value (or as matlab produces it as NaN).
See below example:
A =
[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 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 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 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 NaN NaN
NaN NaN 2 NaN NaN NaN NaN NaN NaN NaN
NaN NaN 1 1 NaN NaN NaN NaN NaN NaN
NaN NaN 3 2 NaN NaN NaN NaN NaN NaN
NaN NaN 2 4 1 NaN NaN NaN NaN NaN
NaN 1 NaN 4 NaN NaN NaN NaN NaN NaN
NaN NaN NaN 3 1 NaN NaN NaN NaN NaN
NaN NaN NaN NaN 3 2 NaN NaN NaN NaN
NaN NaN NaN 1 1 1 NaN NaN NaN NaN
NaN NaN NaN NaN NaN 1 NaN NaN NaN NaN
NaN NaN NaN NaN 1 NaN NaN NaN NaN NaN
NaN NaN NaN NaN NaN 1 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 NaN NaN NaN NaN NaN NaN NaN]
B =
[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 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 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 NaN NaN NaN NaN NaN NaN NaN NaN NaN
NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
2 1 NaN NaN NaN NaN NaN NaN NaN NaN
1 NaN NaN NaN 1 NaN NaN NaN NaN NaN
NaN 1 2 NaN NaN NaN NaN NaN NaN NaN
NaN NaN NaN NaN 1 NaN NaN NaN NaN NaN
NaN NaN NaN 3 1 NaN NaN NaN NaN NaN
NaN NaN NaN 5 2 1 NaN 1 NaN NaN
NaN NaN NaN NaN 1 1 NaN NaN NaN NaN
NaN NaN NaN NaN NaN 2 2 NaN NaN NaN
NaN NaN NaN NaN NaN NaN NaN NaN 1 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 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 NaN NaN NaN NaN NaN NaN NaN
]
What I would like:
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 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 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 NaN NaN NaN NaN NaN NaN NaN NaN NaN
NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
-2 -1 NaN NaN NaN NaN NaN NaN NaN NaN
-1 NaN -2 NaN -1 NaN NaN NaN NaN NaN
NaN 0 -1 1 NaN NaN NaN NaN NaN NaN
NaN NaN 3 2 -1 NaN NaN NaN NaN NaN
NaN NaN 2 1 0 NaN NaN NaN NaN NaN
NaN 1 NaN -1 -2 -1 NaN -1 NaN NaN
NaN NaN NaN 3 0 -1 NaN NaN NaN NaN
NaN NaN NaN NaN -3 0 2 NaN NaN NaN
NaN NaN NaN 1 1 1 NaN NaN -1 NaN
NaN NaN NaN NaN NaN -1 NaN NaN NaN NaN
NaN NaN NaN NaN 1 NaN NaN NaN NaN NaN
NaN NaN NaN NaN NaN 1 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 NaN NaN NaN NaN NaN NaN NaN
What matlab currently returns:
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 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 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 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 NaN NaN
NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
NaN NaN -1 NaN NaN NaN NaN NaN NaN NaN
NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
NaN NaN NaN 1 0 NaN NaN NaN NaN NaN
NaN NaN NaN -1 NaN NaN NaN NaN NaN NaN
NaN NaN NaN NaN 0 NaN NaN NaN NaN NaN
NaN NaN NaN NaN NaN 0 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 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
NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
Thanks!

 Accepted Answer

>> X = cat(3,A,-B);
>> Z = nansum(X,3);
>> Z(all(isnan(X),3)) = NaN
Z =
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 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 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 NaN NaN NaN NaN NaN NaN NaN NaN NaN
NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
-2 -1 NaN NaN NaN NaN NaN NaN NaN NaN
-1 NaN 2 NaN -1 NaN NaN NaN NaN NaN
NaN -1 -1 1 NaN NaN NaN NaN NaN NaN
NaN NaN 3 2 -1 NaN NaN NaN NaN NaN
NaN NaN 2 1 0 NaN NaN NaN NaN NaN
NaN 1 NaN -1 -2 -1 NaN -1 NaN NaN
NaN NaN NaN 3 0 -1 NaN NaN NaN NaN
NaN NaN NaN NaN 3 0 -2 NaN NaN NaN
NaN NaN NaN 1 1 1 NaN NaN -1 NaN
NaN NaN NaN NaN NaN 1 NaN NaN NaN NaN
NaN NaN NaN NaN 1 NaN NaN NaN NaN NaN
NaN NaN NaN NaN NaN 1 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 NaN NaN NaN NaN NaN NaN NaN

More Answers (1)

a = [NaN 2 NaN ; 1 2 NaN ; 3 -4 5] ;
b = [NaN NaN NaN ; 1 NaN -1 ; 2 -4 NaN ] ;
%%sum negelcting NaN
tmp = cat(3,a,b);
c = nansum(tmp,3);
%%diffenrece negelcting nan
tmp = cat(3,a,-b);
c = nansum(tmp,3);
%%replacing nan's woith 0
a(isnan(a)) = 0 ;
b(isnan(b)) = 0 ;
c = a+b ; % sum
c = a-b ; % difference

2 Comments

Thanks... but the problem remains, I can't distinguish a 0 value created when the both cells in A and B have NaN or where both cells had the same value... is there a way to label a particular cell?
So here is what the code gets me: 0 2 0 0 2 1 1 0 5
And here is what I need: NaN 2 Nan 0 2 1 1 0 5
Since the 0 values in the second and third rows are produced by the same number being in each cell in A and B versus the 0 values in the first row which are created because both matrices had no values in that specific cell. The problem is that this is spatial data in 2D so I need to be able to tell whether both matrices have values in a specific cell.
Or I need some way of telling which cells were always empty in both matrices and which cells were filled but with equal value....
e.g. a NaN-NaN = NaN (or whatever label) vs. NaN-5 = -5 or 5-NaN = 5
NaN-NaN = NaN (or whatever label) vs. NaN-5 = -5 or 5-NaN = 5
This case I gave as an example...got through the answer again.

Sign in to comment.

Community Treasure Hunt

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

Start Hunting!