2009-12-19 2 views
1

Я хотел бы сделать элемент мудрое дополнение над матрицами при пропуске NaN значения. MATLAB и Octave имеют nansum, но это делает добавление столбца мудрым в пределах матрицы.сложение матрицы пропуская значения NaN

Пусть:

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


Я хочу:

c = nan+(a, b) 

и

c = b 


и:

d = nan+(a,a) 

и

d = a 
+1

Вместо а = NaN * нули (3) вы можете написать = NaN (3) – Mikhail

ответ

6

Можно еще использовать nansum, если вы сцеплять ваши п-d массивы по п + 1 измерения.

Для 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); 

Общий случай

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, я собирался опубликовать то же самое решение. – Amro

+0

Спасибо, что почти так.
Я все еще хотел NaN + NaN = NaN, а не 0.
но, даже nansum не делает. – Naveen

+0

Я только что добавил вне (и (isnan (A), isnan (B))) = NaN и теперь он работает – Naveen

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

Спасибо, это то, как я бы в конце концов, в конце концов, но его полезно знать, как использовать метод cat и nansum выше. – Naveen

Смежные вопросы