0

同一の変数リストを持つ 2 つのマット ファイルがあります。

file1.mat 内

*Variables*       *Value*       *Type*       

Time              [100X1]       double

Force             [100x1]       double

file2.mat 内

*Variables*      *Value*       *Type*       

Time_1           [90X1]        double

Force_1          [90x1]        double

この 2 つのファイルを垂直方向に連結したいと思います。file2 に追加された接尾辞はorなど_1に変更されます。_2_32

毎回ファイルを開いて変数名を入力する必要がないように、変数を参照してループ内で連結するにはどうすればよいvertcatですか?

4

2 に答える 2

2

loadこのタスクには、コマンドの 2 つの優れたプロパティを使用できます。まず、load出力引数を使用すると、変数名と同じフィールド名を持つ構造体が作成されます。これは、変数の名前を事前に知らなくてもデータをロードできることを意味します。次に、フィールドはアルファベット順に割り当てられます。つまり、force常に最初のフィールド、time2 番目のフィールドになります。

これらのプロパティを組み合わせると、次のことができます。

%# get a listing of all save files
fileList = dir('file*');
nFiles = length(fileList);

loadedData = cell(nFiles,2); %# for storing {force,time}

%# loop through files and write results into loadedData
for iFile = 1:nFiles
    tmp = load(fileList{iFile});
    loadedData(iFile,:) = struct2cell(tmp)';
end

%# catenate
time = cat(1,loadedData(:,2));
force = cat(1,loadedData(:,1));

ファイルがfile1...file10ではなくfile001...と呼ばれている場合file010、コマンドを使用して得られるアルファベット順はdir理想的ではない可能性があることに注意してください。その場合、ファイル名の末尾にある番号を抽出して、リストを並べ替える必要がある場合があります。

于 2012-09-24T02:48:02.227 に答える
0

次のコードスニペットは問題の解決に役立ちますか?

Time_1 = [1; 2];
Time_2 = [2; 3];
Time_3 = 4;
All = [];
for i = 1:3
    CurTime = eval(horzcat('Time_', num2str(i)));
    All = [All; CurTime];
end

基本的に何が起こっているのかというと、、、、およびのサフィックスTime_1をループしています。反復ごとに、変数の名前を文字列に手動で作成し、それを関数の使用に割り当てることで、関連する変数を取得します。次に、を使用して目的の連結を実行するだけです。Time_2Time_3Time_xCurTimeevalCurTime

もちろん、このコードはAllループ内で成長しているため、あまり効率的ではありません。事前にサイズがわかっている場合は、All事前に割り当てることができます。事実の前にサイズが不明な場合は、ここでソリューションを実装できます(または、任意のサイズとして事前に割り当て、ループが完了したらサイズに縮小します)。

あなたが抱えている問題を私が誤解した場合はお知らせください。もっと役立つものを考え出します。

evalまた、悪だと思う人もいます。確かに、コードに10の異なる呼び出しが含まれevalている場合は、おそらく間違っています。

于 2012-09-24T01:47:46.020 に答える