Извлечение всех минимальных значений из набора данных в матрицу - PullRequest
0 голосов
/ 16 октября 2018

Я пытаюсь написать программу, которая извлекает минимальные температуры из набора данных data для данного месяца, времени и года.

Это означает, что человек должен иметь возможность выбрать время, начальный / конечный год и получить матрицу lowTempsOverYears, которая должна содержать все самые низкие значения температуры за январь-декабрь между двумя выбранными годами при определенныхвремя.

Демонстрируя, что я имею в виду, я приведу краткий пример.Возьмите два года: 1997-2001 и время, скажем, 1200. Это должно дать мне матрицу, связывающую самые низкие температуры, зарегистрированные за все месяцы между 1997 и 2001 годами. Результат должен быть матрицей 4x12, где у меня есть 4 разные температуры для каждогостолбец, который обозначает месяц.

Вы можете найти мою программу ниже:

function algo= getMiniserie(data, startYear, endYear, time)

YearInterval = startYear:1:endYear;

for month = 1:12
    lowTempsOverYears = zeros(length(YearInterval),12);
    for yearNumber = 1:length(YearInterval)

        year = YearInterval(yearNumber);

        p = extractperiod(data,year,month,time);

        if ~isempty(p)
            q = min(p);

            lowTempsOverYears(yearNumber,month) = q;
        end
    end
    algo = lowTempsOverYears;
end
end

Переменная data, из которой я извлекаю свои данные, состоит из 3 столбцов и 400k + строк.

* первый столбец обозначает дату (ГГГГММДД)

* второй столбец обозначает время

* третий столбец обозначает температуру

И что за extractperiod Функция делает то, что, как следует из названия, извлекает все температуры для данного месяца / года / времени.

Когда я пытаюсь вызвать свою функцию:

 >> getMiniserie(data, 1997, 2001, 1200)

, я получаю https://imgur.com/a/XpfqUoh.

Любые идеи о том, как яМожно ли улучшить мой код, чтобы получить желаемый результат?

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

Итак, я инициализировал lowTempsOverYears, чтобы сделать его (в данном конкретном случае, когда начальный / конечный год 1997 и 2001 гг.) Матрицей 4x12.Где во время первой итерации месяца все минимальные температуры за январь сохраняются в первом столбце, где все выбранные годы представлены строками.

Пожалуйста, не стесняйтесь спрашивать, пропустил ли я что-то из моего объяснения, я с радостью добавлю к картинке.

код для extractperiod

function mdata = extractperiod(data,year,month,time)

x = year*100 + month;

k = find(floor(data(:,1)/100) == x & (data(:,2) == time));

mdata = data(k,3);

end

1 Ответ

0 голосов
/ 16 октября 2018

Поскольку первая команда в вашем месячном цикле - lowTempsOverYears = zeros(length(YearInterval),12);, вы сбрасываете lowTempsOverYears в матрицу нулей каждый раз в цикле.Это стирает вывод каждого предыдущего цикла.В последний раз в цикле вы сбрасываете все значения в ноль, затем заполняете 12-й столбец.

Переместите строку lowTempsOverYears = zeros(length(YearInterval),12); за пределы цикла месяца, как показано ниже.

function algo= getMiniserie(data, startYear, endYear, time)

YearInterval = startYear:1:endYear;

lowTempsOverYears = zeros(length(YearInterval),12);
for month = 1:12

    for yearNumber = 1:length(YearInterval)

        year = YearInterval(yearNumber);

        p = extractperiod(data,year,month,time);

        if ~isempty(p)
            q = min(p);

            lowTempsOverYears(yearNumber,month) = q;
        end
    end
    algo = lowTempsOverYears;
end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...