用于从数据集 [MATLAB] 中提取最小值的函数



我已经做了一个函数,它可以在给定月份和年份的特定时间内从数据集中提取所有温度。

看起来像:exctractperiod(data, year, month, time)

如前所述,这将一次提取特定月份的所有温度,例如 1400。

我现在想找到某个月的最低温度,比如说多年来的一月。例如,如果我查看 1997 年和 2006 年之间的一月。现在我想要1997-2006年间Janauary的最低注册温度。

到目前为止,我的进展是下面的代码:

function [algo] = getMiniserieone(data, startYear, endYear, time)
v = zeros(12,2); 
for month = 1:12
for year  = startYear:1:endYear
p = extractperiodtwo(data, year, month, time);
q = min(p);
v(month,1) = v(month,1) + q;
v(month,2) = v(month,2) + 1;
algo = v(12,2);
end
end 
end

但是,我确实收到错误消息:

Unable to perform assignment because the size of the left side is 
1-by-1 and the size of the right
side is 0-by-1.

在命令窗口中调用函数时:

>> getMiniserieone(data, 1996, 2006, 1400)


Error in getMiniserieone (line 12)
v(month,1) = v(month,1) + q;

但我无法解决这个问题。

我对上述程序的意图是假设在 1996-2006 年之间的特定时间提取 1 月至 12 月之间所有月份的最低温度。这意味着在 1996-2006 年 1 月的某个时间(例如 1300 年(之间,我想要那个月的最低温度。然后将其存储在我的向量v第 1 列中,然后第 2 列将表示月份。

我的问题是如何解决这个问题,我不太确定错误消息是什么意思?这是否意味着 q 不是单个元素值?

我希望所提供的信息足以理解问题,如果不是随意询问。


根据要求,代码用于extractPeriod()

function [mdata] = extractperiodtwo(data, year, month, time)
x = year*100 +month;
k = find( floor(TEMPUF(:,1)/100) == x & (data(:,2)==time));
mdata = data(k,3);
end

所以你遇到了两个问题。第一种情况是,当您的extractperiodtwo()函数找不到值时,它会返回一个空向量。您可以在循环中写入一个检查,该检查报告未找到给定条目的数据并处理错误。我推荐一个try-catch块(我在下面的代码中实现(。第二个问题与如何存储每次迭代的最小值有关。

这是我的解决方案:

function [algo] = getMiniserieone(data, startYear, endYear, time)
%initialize output
algo = [zeros(12,1), (1:12)']; %col1 = min(temps), col2 = month
% loop through months
yearsToTest = startYear:1:endYear;
for month = 1:12
%initialize a year storage, i.e. on the first iteration
% this will be january minimum temps from startYear:endYear, 
% on iteration 2, it will be all february temps from startYear:endYear
% and so on until it completes month == 12.
lowTempsOverYears = nan(1,length(yearsToTest));
for yearNum = 1:length(yearsToTest)
%edit: forgot to paste this line, sorry.
year = yearsToTest(yearNum);
p = extractperiodtwo(data, year, month, time);
q = min(p);
try
%try appending the min
lowTempsOverYears(yearNum) = q;
catch
fprintf(2, ...
'nNo data found for month=%d, year=%d.n  Skipping...n', ...
month, ...
year);
continue
end
end
% inner loop is over, now we need the minimum of mins for the month
algo(month, 1) = min(lowTempsOverYears,[],'omitnan');
end
end

所以我所做的是添加第二个向量,lowTempsOverYears跟踪startYear:endYear间隔内每个月min(p)。然后我得到其中的最小值,并将其存储在当月的相应行中,在输出变量中。我用nan()初始化lowTempsOverYears,因为它允许我稍后将'omitnan'标志设置为 true 的情况下获取min(),从而有效地忽略向量中出现的任何 nan。

或者

您可以在矩阵中捕获年份和月份的所有温度,然后执行您选择的统计数据。例如,函数的内部可以是:

function algo = getMiniserieone(data, startYear, endYear, time)
algo = [zeros(12,1), (1:12)'];
yearsToTest = startYear:1:endYear;
% create local storage of values as matrix
v = nan(12,length(yearsToTest));
%loop
for month = 1:12
for yearNum = 1:length(yearsToTest)
% current year to gather data from
year = yearsToTest(yearNum);
% p could be scalar, vector, empty
p = extractperiodtwo(data, year, month, time);
% q is scalar or empty
q = min(p);
try
%try inserting the min temp
v(month,yearNum) = q;
catch
fprintf(2,'nNo data at month=%d, year=%d.n  Skipping...n', ...
month, year ...
);
continue
end
end
end
% now all data is stored in a matrix perform statistic
algo(:,1) = min(v, [], 2, 'omitnan');
end

最新更新