Substracting matrix with NaN values
4 views (last 30 days)
Show older comments
I have 4 matrix A, B, C and D. All matrix have NaN values, and matrix C and D have a lot of NaN values. Now I want to take A and substract B, C and D from it. I want that the result matrix contains only a NaN value if A has NaN or if A has a value but B, C and D do all have a NaN value. For example if a specific cell in A has a value, and the same cell has also a value in B but not in C and D (because there is an NaN) I want that matlab takes the NaN in C and B as 0. The matrix are really big so I con not do it by hand.
Example:
A=[ 1 2 3; 4 5 6; 7 NaN NaN] B =[ 1 2 3; 4 5 6; 7 2 NaN] C = [ 1 NaN 3; 4 5 6; 7 1 NaN] D = [ 1 2 3; 4 NaN 6; 7 1 NaN]
then A-B-C-D=E should be E=[ -2 -2 -6; -8 -5 -12; -14 NaN NaN]
0 Comments
Accepted Answer
Walter Roberson
on 8 Mar 2017
mask = isnan(B) & isnan(C) & isnan(D);
tB = B; tB(isnan(B)) =0;
tC = C; tC(isnan(C)) =0;
tD = D; tD(isnan(D)) =0;
E = A - tB - tC - tD;
E(mask) = NaN;
Any nan in A will be carried through.
More Answers (1)
KSSV
on 8 Mar 2017
Edited: KSSV
on 8 Mar 2017
A=[ 1 2 3; 4 5 6; 7 NaN NaN] ;
B =[ 1 2 3; 4 5 6; 7 2 NaN] ;
C = [ 1 NaN 3; 4 5 6; 7 1 NaN] ;
D = [ 1 2 3; 4 NaN 6; 7 1 NaN] ;
% E=[ -2 -2 -6; -8 -5 -12; -14 NaN NaN] ;
R(:,:,1) = A ;
R(:,:,2) = -B ;
R(:,:,3) = -C ;
R(:,:,4) = -D ;
iwant = nansum(R,3)
You have to cross check your E once.
Other method using loops:
A=[ 1 2 3; 4 5 6; 7 NaN NaN] ;
B =[ 1 2 3; 4 5 6; 7 2 NaN] ;
C = [ 1 NaN 3; 4 5 6; 7 1 NaN] ;
D = [ 1 2 3; 4 NaN 6; 7 1 NaN] ;
E=[ -2 -2 -6; -8 -5 -12; -14 NaN NaN] ;
R(:,:,1) = A ;
R(:,:,2) = -B ;
R(:,:,3) = -C ;
R(:,:,4) = -D ;
% iwant = nansum(R,3)
[m,n,p] = size(R) ;
iwant = NaN(m,n) ;
for i = 1:m
for j = 1:n
k = squeeze(R(i,j,:)) ;
k = k(~isnan(k)) ;
if ~isempty(k)
iwant(i,j) = sum(k) ;
end
end
end
See Also
Categories
Find more on Linear Algebra in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!