0

我有一个要加载的文本文件列表,然后提取它们全部重叠的行。第一列包含年份,每个数据集跨越不同的年份,但它们都在中间重叠。最后,我想在一个矩阵中有一个重叠年份的三维矩阵。我的代码一直卡在我注释掉的那一行。我知道它不正确,但谁能告诉我为什么它不正确?

clear all
name_list =  {'Beijing';'GT';'soi';'naoi';'Sydney_Airport';'Los Angeles';'Paris';'Presque Isle'};
[m,n] = size(name_list);

files = dir('*.txt');
[m,n] = size(files);

for i=1:m
    eval(['load ' files(i).name ' -ascii']);
    vals{i} = load(files(i).name);
    matrix = vals{i};
    station = (files(i).name(1:end-4));
    startyear(i) = min(matrix(:,1));
    endyear(i) = max(matrix(:,1));
    allstart = max(startyear);
    allend = min(endyear);
    %matrixnew(i) = matrix(allstart:allend,2:13,i); 
end
4

1 回答 1

0

这里有两个问题:

  1. 您的注释行%matrixnew(i) = matrix(allstart:allend,2:13,i);假定这matrix是一个 3-d 数组,但在其他地方您将其视为 2-d(我相信它load总是返回一个 2-d 数组)。这可能就是您收到“索引超出矩阵尺寸”错误的原因。例子:

    >> foo = rand(10,10);
    >> foo(2:10,3:4,2)
    Index exceeds matrix dimensions. 
    

    也许你想要matrix(allstart:allend,2:13)?但这不起作用,因为allstart包含 a year,它可能不是数组的有效索引(更可能是您的错误的原因)。使用包含最小值的索引会更接近正确,但我认为它仍然行不通。

  2. matrixnew指的是数组的单个元素。您不能将数组分配给数组的元素。grantnz 是正确的,制作matrixnew一个单元阵列可以解决这个错误,我猜最后你可以把你的单元阵列变成 3-d 阵列。

我认为你走在正确的轨道上,但缺少一些东西来完成这项工作。需要考虑的一件事是,您似乎正在尝试一次性完成所有操作。我不明白这怎么行。您需要先处理所有文件,然后才能决定要保留的年份范围。所以要分多次执行:首先将所有文件中的所有数据加载到一个单元格数组中,然后计算出年份范围,然后从每个文件中提取该年份范围内的数据。

于 2012-11-13T23:58:42.837 回答