Matlab cumsum сбрасывается в NaN?

Если у меня есть вектор 1 'с или NaN 'вот так:

[1 1 1 NaN 1 1 NaN 1 1 1 1]

Как я могу сбросить сумму на ноль в месте расположения NaN, как показано ниже:

[1 2 3 0 1 2 0 1 2 3 4]

В идеале я хотел бы иметь векторизованное решение, поскольку мне нужно сделать это для каждого столбца в большой матрице, а расположение NaN не является постоянным в столбцах.

Заранее спасибо.

Ответы на вопрос(3)

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

 Marc21 окт. 2012 г., 12:14
Всегда +1 для соответствующей записи обмена файлами. ПОВТОРНО!
Решение Вопроса

v = [1 1 1 NaN 1 1 1 1 NaN 1];
a = v==v;              %% convert the values first to [1 1 1 0 1 1 1 1 0 1] format
n = a==0;              %% positions of the NaNs
c = cumsum(a);         %% your intermediate result
d = diff([0 c(n)]);    %% runs of ones
v(n) = -d;             %% replace Nans by -3, -4      [1 1 1 -3 1 1 1 1 -4 1] 
cumsum(v)              %% the answer [1 2 3 0 1 2 3 4 0 1]

Примечание: гаваньпроверил экстремальные условия (NaN в первой / последней позиции, подрядNaNи т. д.)

 user164251321 окт. 2012 г., 09:44
Это прекрасно работает !!! Большое спасибо.

Векторизованных» линии:

A(isnan(A)) = 1-diff([0 find(isnan(A))]);
cumsum(A)

ans =

  1     2     3     0     1     2     0     1     2     3     4

Хитрость заключается в заменеNaN со значением, которое будет сброшеноcumsum в0 в этих точках.

 Phillip Cloud13 авг. 2013 г., 19:29
Я думаю, что это будет работать только для вектора, состоящего из единиц иnanс, так какfind возвращает индексы.

Ваш ответ на вопрос