2025-06-05 08:48:33 +02:00

34 lines
745 B
Matlab

function y = smartsum(x,dim)
%SMARTSUM Sum ignoring NaN.
%
% Same as SUM except that it returns the sum of the finite elements
% instead of propagating NaN and Inf
% Returns NaN if no element is finite
if nargin==1,
% Determine which dimension SUM will use
dim = min(find(size(x)~=1));
if isempty(dim), dim = 1; end
k=isfinite(x);
% x(~k)=-9999*ones(size(x(~k)));
% warning off
% y=sum(x.*k)./(sum(k,dim)>0);
% warning on
x(~k)=0;
y=sum(x, dim);
y(sum(k, dim)==0)=NaN;
else
% k=isfinite(x);
% x(~k)=-9999*ones(size(x(~k)));
% warning off
% y=sum(x.*k,dim)./(sum(k,dim)>0);
% warning on
k=isfinite(x);
x(~k)=0;
y=sum(x, dim);
y(sum(k, dim)==0)=NaN;
end