1

現在、すべての値の行列を作成するために、すべて同じ変数を含む多数の MATLAB ファイルを読み込もうとしています。

これらのファイルはすべて数字 (つまり 40_analysed.mat) で始まります。これは、以前に正規表現を使用してさまざまな生データ ファイルから抽出されたものです。つまり、すべての個々の数字 (id) で構成されるベクトルを持っています。

以下のコードを使用して値をロードし、すべての個人のデータを 1 つのマトリックスに表示しようとすると、ファイルが英数字順に (ID に従って) ロードされず、ランダムにロードされたように見えます。

file = dir('*_analysed.mat');
for i=1:length(id);
    load(file(i).name,'means');
    overallThresholds{i} = means;
end
overallMeans = cell2mat(overallThresholds)

結果の行列が正しい順序になるようにするにはどうすればよいですか? この質問があまり意味をなさない場合はお詫びします。問題を明確にするのは少し難しいです。

4

2 に答える 2

1

コマンドを使用する場合dir、結果がアルファベット順になるとは限りません。実際、マニュアルには次のように明示的に記載されています。

dir は、MATLAB の現在のフォルダー内のファイルとフォルダーを一覧表示します。結果は、オペレーティング システムから返された順序で表示されます。

これをアルファベット順に入手したとしても、次回も入手できるという保証はありません。dirしたがって、コマンドを使用して結果を並べ替える必要がありますsort

  [~,order] = sort( {file.name} );
  file = file(order);
于 2012-10-10T11:51:30.740 に答える
1

ファイル名に固定精度の数値がない場合 (@FakeDIY が指摘しているように、既にソートされていることを意味します)、次のようにすることができます。

file = dir('*_analysed.mat');
overalThresholds = cell(1, length(id));
IDs = zeros(1, length(id));
for i = 1:length(id)
    fileName = file(i).name;
    IDs(i)   = str2double( strrep( fileName, '_analysed.mat', '' ) );
    data     = load(fileName, 'means');
    overallThresholds{i} = data.means;
end
[~, reordering] = sort(IDs);
overallThresholds = overallThresholds(reordering);

つまり、ファイル ID を別の配列に保存してから、 SORTの 2 番目の出力を使用して、overallThresholds を並べ替えて ID の並べ替え順序にします。

(また、配列を事前に割り当て、関数形式のLOADを使用しますが、実際にそれを行う必要はありません)。

于 2012-10-10T11:52:20.667 に答える