0

読み込みたいテキスト ファイルのリストがあり、それらがすべて重なっている行を抽出します。最初の列には年が含まれており、各データ セットは異なる年のチャンクにまたがっていますが、それらはすべて途中で重複しています。最後に、重なり合う年を1つのマトリックスに含む3次元マトリックスを作成したいと思います。コメントアウトした行でコードが動かなくなります。私はそれが間違っていることを知っていますが、なぜそれが間違っているのか誰か教えてもらえますか?

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

ここで 2 つの問題:

  1. コメント行はそれが 3 次元配列であると%matrixnew(i) = matrix(allstart:allend,2:13,i);想定していますが、他の場所では 2 次元配列として扱います (常に 2 次元配列を返すと思います)。これが、「インデックスがマトリックスの次元を超えています」というエラーが発生する理由である可能性があります。例:matrixload

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

    多分あなたがしたいmatrix(allstart:allend,2:13)ですか?しかし、おそらく配列の有効なインデックスではないyearallstartが含まれているため、これは機能しません (エラーの原因となる可能性が高くなります)。最小の値を含むインデックスを使用する方が正しいことに近づきますが、それでもうまくいかないと思います。

  2. matrixnew配列の単一要素を参照します。配列の要素に配列を割り当てることはできません。grantnzの言うとおりmatrixnew、セル配列を作成するとこのエラーが修正されます。最終的には、セル配列を 3 次元配列に変換できると思います。

あなたは正しい軌道に乗っていると思いますが、これを機能させるにはいくつかの要素が欠けています。考慮すべきことの 1 つは、1 つのパスですべてを実行しようとしているように見えることです。それがどのように機能するかわかりません。保持する年の範囲を決定する前に、すべてのファイルを実際に保存する必要があります。したがって、複数のパスで実行します。まず、すべてのファイルからすべてのデータをセル配列に読み込み、次に年の範囲を計算し、次に各ファイルからその年の範囲のデータを取得します。

于 2012-11-13T23:58:42.837 に答える