Накопительная сумма Matlab для цикла

Я пытаюсь суммировать суммарные часы подряд (переменные "часы") между наблюдениями ураганов для всех наблюдений в конкретном шторме и среди множества штормов, чтобы определить продолжительность шторма. Вот что у меня есть:

stormid = [188, 188, 288, 288, 288, 388, 488, 488, 588...] %numbers represent a unique 
% code identifying a particular storm (i.e. 188= 1st storm of 1988)

hrs = [0,6,0,6,6,0,0,6,0...] %hours between observations in each storm
% where 0 indicates the start of a storm (this corresponds with the stormid above)

Моя цель состоит в суммировании часов для каждого идентификатора шторма, поэтому я подумал, что использование accumarray будет работать, но это не так. Вот что я попробовал.

duration= accumarray(stormid, hrs, []); 

Затем я также попробовал cumsum, но я не смог понять, как использовать cumsum только при одинаковых идентификаторах шторма.

Если у кого-то есть идеи, я буду очень признателен! Благодарю.

2 ответа

Попробуй это:

uni_id = unique(stormid);
cumdur = arrayfun(@(x) cumsum(hrs(stormid == x)), uni_id, 'uni', false);

Результат, cumdurявляется клеточным массивом cumsum результаты применяются к hrs обозначается последовательным (уникальным) stormid"S.

Это будет работать?

Изменить: У меня недостаточно очков, чтобы комментировать, поэтому я просто изменил предложенный код здесь. (Правильно ли я считаю, что ошибка возникает из-за недостаточной длительности?)

clear duration
unique_storm_id = unique(stormid);
duration = zeros(length(unique_storm_id),length(hrs));
for k = 1:length(unique_storm_id)
    duration{k} = cumsum(hrs(stormid == unique_storm_id));
end

Затем вы можете получить доступ к продолжительности шторма id = j, используя

index = find(unique_storm_id == j);
duration{index}
Другие вопросы по тегам