将循环矩阵复制到一个3d矩阵中

时间:2012-11-13 20:18:02

标签: matlab loops matrix

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

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

1 个答案:

答案 0 :(得分:0)

这里有两个问题:

  1. 您的评论专线%matrixnew(i) = matrix(allstart:allend,2:13,i);假定matrix是一个三维数组,但在其他地方您将其视为二维(我相信load总是返回一个二维阵列)。这可能是您获得“索引超出矩阵维度”错误的原因。例如:

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

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

  2. matrixnew指的是数组的单个元素。您不能将数组分配给数组的元素。 grantnz是正确的,使matrixnew一个单元格数组可以解决这个错误,我想最终你可以把你的单元格数组变成三维数组。

  3. 我认为你走在正确的轨道上,但却缺少一些让这项工作成功的方法。需要考虑的一件事是,看起来你试图在一次通过中做所有事情。我不明白这是怎么回事。在确定要保留的年份范围之前,您需要真正的所有文件。所以在多次传递中这样做:首先将所有文件中的所有数据加载到一个单元格数组中,然后计算出年份的范围,然后从这些年份的每个文件中提取数据。