Matlab: Ежедневный трехмерный массив к ежемесячному - работа с чередующимися днями месяца и високосными годами - как это сделать? - PullRequest
0 голосов
/ 26 октября 2019

В Matlab у меня есть матрица 720x360x365 (назовем это A) суточных осадков за один год. 365 обозначает дни в году. Мне нужно написать код для преобразования этих ежедневных данных в месячную сумму. Если я начинаю с января, мне нужно сделать среднее (A, 3) первых 31 дней, затем среднее (A, 3) февраля, следующих 28 или 29 дней. Поскольку дни чередуются между 31 и 30 (и 28 или 29 в феврале), я не знаю, как написать код для этого. Пожалуйста, помогите мне, я не знаю, как это сделать. спасибо

1 Ответ

1 голос
/ 26 октября 2019

Вы можете использовать mat2cell, чтобы разделить данные в ячейках за месяц. Сначала создайте вектор с количеством дней в месяце (без учета високосных лет), а затем используйте это для разделения данных. Затем вы можете использовать cellfun в каждой ячейке (то есть месяце), чтобы получить любую метрику, которую вы определяете в месяц:

data =  rand(720, 360, 365);
days_per_month = [31 28 31 30 31 30 31 31 30 31 30 31];

% divide months in cells
data_cell = mat2cell(data, size(data,1), size(data,2), days_per_month);
mean_cell = cellfun(@(A) mean(A,3), data_cell, 'UniformOutput', false)

Чтобы использовать это в цикле и учитывать високосные годы, вы можете использовать функциюleapyear(year):

days_per_month = [31 28 31 30 31 30 31 31 30 31 30 31];
years = 1984:2015
for k = 1:numel(years)
    if leapyear(years(k))
        days_per_month(2) = 29;
    else
        days_per_month(2) = 28;
    end

    % rest of what you want to do

end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...