Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 将数据集中的所有最小值提取到矩阵中_Matlab - Fatal编程技术网

Matlab 将数据集中的所有最小值提取到矩阵中

Matlab 将数据集中的所有最小值提取到矩阵中,matlab,Matlab,我正试图编写一个程序,从数据集中提取给定月份、时间和年份的最低温度,data 这意味着一个人应该能够选择一个时间,开始/结束年份,并获得一个矩阵,lowTempsOverYears,该矩阵应该包含在特定时间的两个选定年份之间的1月至12月的所有最低记录温度 为了说明我的意思,我将举一个简单的例子。以1997-2001两年为例,时间是1200年。这应该给我一个矩阵,包含1997年至2001年期间所有月份记录的最低温度。输出应该是一个4x12矩阵,其中每列有4个不同的温度,表示月份 您可以在下面找到

我正试图编写一个程序,从数据集中提取给定月份、时间和年份的最低温度,
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
我从中提取数据的
data
变量由3列和400k+so行组成

*第一列表示日期(YYYYMMDD)

*第二列表示时间

*第三列表示温度

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

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

 >> getMiniserie(data, 1997, 2001, 1200)
我明白了

如何改进代码以获得所需的输出

我的想法是创建一个变量,它存储每个月迭代的所有最小值

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

如果我在解释中遗漏了什么,请尽管问,我很乐意为图片添加内容

提取期间的代码

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

因为月循环中的第一个命令是
lowTempsOverYears=零(长度(YearInterval),12),每次通过循环,您都要将
lowTempsOverYears
重置为一个零矩阵。这将擦除前一个循环的输出。最后一次通过循环时,将所有值重置为零,然后填充第12列

将行
lowTempsOverYears=0(长度(年间隔),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

当您尝试运行该函数时,得到的jibberish是什么?这是错误还是不正确的输出?有时候,jibberish可以说明程序正在做什么。@Justin打赌忽略它可能是一个错误。因为我对matlab是新手。但是,这是我得到的输出,它不是正确的输出。该输出表明,您的代码只提供12月份的温度,因为前11列数据是零。您确定其他月份没有为
p
返回空数组吗?另外,如果您可以发布
extractperiod
的代码,这可能也会有帮助。@justin当然,我现在添加了
extractperiod
。我不确定其他月份是否返回了
p
的empy数组。我该怎么检查呢?非常感谢!如果你不介意我问的话。你是怎么推断出来的?我一直在仔细地浏览每一行,试图把它想象成一个流程图,看看每一步都会发生什么。你有没有一个方法,或者这只是一个非常琐碎的发现?我也在通过每一行,在我的脑海中循环。我有时会将每个循环的结果写在纸上,并跟踪
lowTempsOverYears
应该包含的内容。这通常是一种“较慢”的代码处理方式,可以确保您不会忽略一行代码。当我第二次查看时,我看到
lowTempsOverYears
设置为零,并意识到这是不需要的
并在命令窗口中手动检查
lowTempsOverYears
的输出。或者,删除该行末尾的分号,MATLAB将显示每个循环的输出。