2009-12-19 21 views
1

Je voudrais faire l'addition sage par élément au-dessus des matrices tout en sautant NaN valeurs. MATLAB et Octave ont nansum, mais il ajoute des colonnes dans une matrice.addition de matrice valeurs de NaN de saut

Soit:

a = NaN * zeros(3) 
b = ones(3) 


Je veux:

c = nan+(a, b) 

et

c = b 


et:

d = nan+(a,a) 

et

d = a 
+1

Au lieu d'un = NaN zéros * (3) vous pouvez écrire un = NaN (3) – Mikhail

Répondre

6

Vous pouvez toujours utiliser Nansum, si vous CATENATE vos tableaux de n-d le long de la n + 1ère dimension.

2D

% commands de-nested for readability. You can do this with a single line, of course 
tmp = cat(3,a,b); 
c = nansum(tmp,3); 

Le cas général

function out = nansumByElement(A,B) 
%NANSUMBYELEMENT performs an element-wise nansum on the n-D arrays A and B 
% A and B have to have the same size 

% test input 
if nargin < 2 || isempty(A) || isempty(B) || ndims(A)~=ndims(B) || ~all(size(A)==size(B)) 
error('please pass two non-empty arrays of the same size to nansumByElement') 
end 

% calculate output 

nd = ndims(A); % get number of dimensions 
% catenate and sum along n+1st dimension 
out = nansum(cat(nd+1,A,B),nd+1); 
+0

+1, j'étais sur le point de poster la même solution .. – Amro

+0

Merci, ça fait presque ça.
Je voulais toujours NaN + NaN = NaN et non 0.
mais, même nansum ne fait pas cela. – Naveen

+0

Je viens d'ajouter out (et (isnan (A), isnan (B))) = NaN et maintenant ça marche – Naveen

1
a_fixed = a; 
a_fixed(isnan(a)) = 0; 
b_fixed = b; 
b_fixed(isnan(b)) = 0; 
c = a_fixed.+b_fixed; 
+0

Merci, voilà comment je devrais allé à ce sujet finalement, mais il est bon de savoir comment utiliser la méthode chat et nansum ci-dessus aussi. – Naveen