Как суммировать ряд значений, игнорируя любые значения NaN? - PullRequest
1 голос
/ 26 марта 2019

Я использую MATLAB версии R2015a.

Я получаю последовательный ответ от решения оптимальной задачи несколько раз, и я хочу получить их сумму и усреднить их.Тем не менее, некоторые из них являются NaN.Как мне написать код, чтобы игнорировать эти NaN и суммировать другие, которые не являются NaN?

Ответы [ 3 ]

3 голосов
/ 26 марта 2019

Опция 1: решение без инструментов, используя sum и isnan из базы MATLAB.

A = [1 2 3 4 5 6 7 8 9 NaN];
sum(A(~isnan(A)))               % No toolbox required

Вариант 2: nansum (см. ответ из OP) Примечание: nansum требуется набор инструментов статистики.

nansum(A)                       % Requires Statistics toolbox

Код проверен с использованием MATLAB R2018b.


Обновление из комментариев
Отличное предложение от @ Cris Luengo для тех, у кого более свежие версии. Не требует набора инструментов.

sum(A,'omitnan')                % No toolbox required

Еще одно предложение от @ Бена Фойгта для некоторых приложений. Также не требуется никаких инструментов.

sum(A(isfinite(A)))             % No toolbox required
2 голосов
/ 26 марта 2019

Вы можете использовать встроенные функции, как предложено в ответе выше.Если вы хотите знать логику и использовать цикл ... вы можете следовать, как показано ниже:

A = [NaN 1 2 NaN 3 4 7 -1 NaN] ; 
count = 0 ;
thesum = 0 ; 
for i = 1:length(A)
    if ~isnan(A(i))
        count = count+1 ;
        thesum = thesum+A(i) ;
    end
end
1 голос
/ 26 марта 2019

Вы можете использовать аргумент omitnan

A = [1 2 3 4 5 6 7 8 9 NaN];
s = sum( A, 'omitnan' )

Обратите внимание, это буквально тот же код, который используется функцией nansum из панели инструментов Статистика, которая была введена до R2006a, поэтому я хотел быдумаю, что совместимость довольно хорошая.

...