2017-11-30 12 views
0

クエリの2つの部分があります 1)構造の異なるフィールドを別々のファイルとして保存する方法 2)中間ディレクトリが存在しない場合、保存コマンドを実行して保存パスにディレクトリを作成しますか?私は別の.MATファイルとして構造体データの各フィールドを保存したい構造体の複数のフィールドを別々のマットファイルとして保存し、ディレクトリが存在しないディレクトリを作成する

data.a.name='a'; 
data.a.age=5; 
data.b.name='b'; 
data.b.age=6; 
data.c.name='c'; 
data.c.age=7; 
fields=fieldnames(data); 
for i=1:length(fields) 
    save(['E:\data\' fields{i} '.mat'],'-struct','data'); 
end 

:最初の部分については

。ループを実行した後、私はE:\ dataの内部に3つのファイルがあるはずです。 a.mat、b.mat、c.matを含み、a.matはフィールド 'a'のデータのみを含み、b.matはフィールド 'b'のデータのみを含み、以下同様である。

上記のコードを実行すると、私のディレクトリに3つのファイルがありますが、各ファイルには個々の変数ではなく、3つの変数a、b、cの内容がすべて同じです。

コマンドが動作しない、次のとおりです。

for i=1:length(fields) 
    save(['E:\data\' fields{i} '.mat'],'-struct',['data.' fields{i} ]); 
end 

Error using save 
The argument to -STRUCT must be the name of a scalar structure variable. 

使用する各フィールドを保存するための一時的なvaiablesを作成しなくても、私の目的を達成するためのコマンドを保存するいくつかの方法がありますか?第二の部分については

私は、ディレクトリ構造に格納する必要があるファイルの数が多いです。私は仕事に従うことを望む。

test='abcdefgh'; 
save(['E:\data\' test(1:2) '\' test(3:4) '\' test(5:6) '\result.mat']) 

しかし、任意の中間ディレクトリならば、それは次のようなエラーに

Error using save 
Cannot create 'result.mat' because 'E:\data\ab\cd\ef' does not exist. 

を示したが、その後、彼らはsaveコマンドによって作成されなければならない、存在しません。ディレクトリが存在するかどうかを確認して存在コマンドを使用して確認し、mkdirを使用してディレクトリを作成することで、この部分を動作させることができます。私は気づいていないいくつかの議論を使用して作業を行うようにセーブコマンドを強制するいくつかの方法があるかどうか疑問に思っています。

+0

2つの全く関係のない質問がある場合は、2つの質問をしてください。 – excaza

答えて

2

saveへのフィールド入力引数が間違っています。フォーマットはマニュアルに従って、:

'-struct',structName,field1,...,fieldN 

ように、適切なsave構文は次のとおりです。

data.a.name='a'; 
data.a.age=5; 
data.b.name='b'; 
data.b.age=6; 
data.c.name='c'; 
data.c.age=7; 

fields = fieldnames(data); 
for ii = 1:length(fields) 
    save(['E:\data\' fields{ii} '.mat'], '-struct', 'data', fields{ii}); 
end 

そして、いや、あなたは中間ディレクトリを生成するsaveを強制することはできません。保存パスの存在を最初に確認し、必要に応じて作成します。

関連する問題