Накопительная сумма 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}