【问题标题】:Extracting all minimum values from a data-set into a matrix将数据集中的所有最小值提取到矩阵中
【发布时间】:2018-10-16 09:29:08
【问题描述】:

我正在尝试编写一个程序,该程序从数据集data 中提取给定月份、时间和年份的最低温度。

这意味着一个人应该能够选择一个时间,开始/结束年份并获得一个矩阵,lowTempsOverYears,其中应该包含在特定时间的两个选定年份之间 1 月至 12 月的所有最低记录温度。

我将举一个简短的例子来说明我的意思。以两年为例: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

我从中提取数据的datavariable 包含 3 列和 400k+ 行。

*第一列表示日期(YYYYMMDD)

*第二列表示时间

*第三列表示温度

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

【问题讨论】:

  • 当你尝试运行这个函数时,你得到了什么乱码?它是一个错误还是只是不正确的输出?有时,这些胡言乱语可以揭示程序正在做什么。
  • @justinwager 忽略它可能是个错误。因为我是matlab的新手。然而,这是我得到的输出 imgur.com/a/XpfqUoh ,这不是正确的输出。
  • 该输出显示您的代码只为您提供 12 月的温度,因为前 11 列数据为零。您确定其他月份不会为 p 返回一个空数组吗?
  • 另外,如果您可以为extractperiod 发布您的代码,这也可能对您有所帮助。
  • @JustinWager 当然,我现在添加了extractperiod。我不确定其他月份是否为p 返回了一个空数组。我该如何检查?

标签: matlab


【解决方案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

【讨论】:

  • 非常感谢!如果你不介意我问。你是怎么推断出来的?我一直在仔细检查每一行,并试图把它想象成一个流程图,看看每一步会发生什么。你有什么方法吗?还是很容易发现?
  • 我也在遍历每一行并遍历我脑海中的循环。我有时会在纸上写下每个循环的结果,并跟踪 lowTempsOverYears 应该包含的内容。这通常是浏览代码的一种“较慢”的方式,可确保您不会忽略一行。当我第二次经历时,我看到 lowTempsOverYears 设置为零,并意识到这是不希望的。
  • 您也可以在algo = lowTempsOverYears; 行上设置一个断点,然后在命令行窗口中手动检查lowTempsOverYears 的输出。或者,删除该行末尾的分号,MATLAB 将显示每个循环的输出。
猜你喜欢
  • 2014-10-01
  • 2012-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-25
  • 2017-04-02
  • 2020-11-29
相关资源
最近更新 更多