从数据集中提取所有最小值到矩阵中

时间:2018-10-16 00:37:31

标签: matlab

我正在尝试编写一个程序,该程序将从给定的月份,时间和年份的数据集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 +行组成。

*第一列表示日期(YYYYMMDD)

*第二列表示时间

*第三列表示温度

extractperiod函数的作用是,顾名思义,它提取给定月份/年份/时间的所有温度。

当我尝试通过以下方式调用函数时:

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

我得到https://imgur.com/a/XpfqUoh

  
    

关于如何改进代码以获得所需输出的任何想法吗?

  

我的想法是制作一个变量,该变量存储一个月的每次迭代的所有最小值。

因此,我将lowTempsOverYears初始化为一个4x12矩阵(在这种特殊情况下,开始/结束年份是1997和2001)。在第一个月迭代期间,它将第一月份的所有最低温度存储在第一列中,其中所有选定的年份都由行表示。

请随时询问我是否从解释中省略了一些内容,我会很乐意添加到图片中。

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 :(得分:1)

由于月份循环中的第一个命令是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