m-file上のデータの保存あれこれ

MATLABでデータを保存したり書き出したりする際にsave関数やcsvwrite,dlmwriteを使用する人は多いんじゃないでしょうか。
こう言った関数を使用する際、プログラムを何回かまわしてるうちに前に保存していたmatファイルあるいはcsvファイル,txtファイルを上書きしてしまった!なんてことはよくあるはず(私だけ?)

そこでほぼ間違いなく上書きしてしまわないような方法を紹介。
その最善の策は「ファイル名自体に計算した日時が書き込まれるようにする」ことです。
全くの同タイミングで計算が行われない限りは、上書きされようがありません。

“日時の表示”に使う関数は“fix(clock)”というものです。
これによって自動的に1×6のベクトルが作成されるのですが、このベクトル内の情報が左から順に「年(西暦)」「月」「日」「時」「分」「秒」となっています。
要はこれを“num2str”など“変数を文字列に変換する”関数を使って、ファイル名に書き込んでやればいいというわけ。

一例を示します。(外部サイトのプログラムを参考にしました)


clockdata=fix(clock);
%% 年,月,日,時間,分,秒
clocky=num2str(clockdata(1));
if clockdata(2)<10
clockm=['0', num2str(clockdata(2))];
else
clockm=num2str(clockdata(2));
end
if clockdata(3)<10
clockd=['0', num2str(clockdata(3))];
else
clockd=num2str(clockdata(3));
end
if clockdata(4)<10
clockh=['0', num2str(clockdata(4))];
else
clockh=num2str(clockdata(4));
end
if clockdata(5)<10
clockmin=['0', num2str(clockdata(5))];
else
clockmin=num2str(clockdata(5));
end
if
clockdata(6)<10
clocksec=['0', num2str(clockdata(6))];
else
clocksec=num2str(clockdata(6));
end

filename=['〜〜〜',clocky,'_',clockm, clockd,'_', clockh, clockmin, '.mat']; %matファイルで保存する場合

% csvファイルでデータを保存するとき
filename=['〜〜〜',clocky,'_',clockm, clockd,'_', clockh, clockmin, '.csv'];
csvwrite(filename,[a;b;c]) % 大した精度が必要ないとき
dlmwrite(filename,[a;b;b], 'precision', '%.8f') % 精度が欲しいとき

% 変数全部をmatファイルで保存するとき
save (filename)

% 変数a,b,cのみをmatファイルで保存するとき
save (filename,'a','b','c')

また,変数の値を変えてforループを用いて計算を何回もする場合、1ループごとにデータを保存したいという場合も同じような考え方で使用したパラメータの値をファイル名に書き込むこともできる。
例えばa=1:10、b=1:10、c=1:10としてforループによって何回も計算をするような例を次に示す。

for a=1:10
for b=1:10
for c=1:10
d=a+b^2+c^3;
filename=['data_a',num2str(a),'_b',num2str(b),'_c',num2str(c),'.mat'];
save (filename,'d')
end
end
end