【发布时间】: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