5. ファイル処理
ディスクファイルからデータを読み込んだり,ディスクファイルへデータを書き込んだり
することをファイルの入出力処理と呼びます。具体的な使用例として,例えば次のよう
な場合が想定されます。
例) ・ 他言語で作成されたデータを利用する。またはMatlabで作成したデータ
を他のアプリケーションで使用する場合
(FortranやC言語とのやり取り,Excelとのやり取りなど)
・ 大規模な連立一次方程式を解く際の途中の計算結果を一時的なファイル
に保存して使用する場合
・ インターネットからダウンロードした地震波のデジタル記録を読み込み,
構造物の応答解析などをする場合
・ 衛星画像やビデオカメラの画像を取り込み,画像処理する場合
Matlabでは,非常に多くのデータ形式を取り扱うことができますが,以下では
アスキーファイル,バイナリファイルの基本についてのみ説明します。
詳細については,Matlabのマニュアルを参照して下さい。
(1) アスキーファイル(テキスト形式のデータファイル)
アスキーファイルを扱う場合には,データのフォーマット(書式)を付けない場合と
フォーマット(書式)を考慮する場合で記述の仕方が異なります。
(a) フォーマット(書式)なしアスキーファイル
データファイルの出力(保存,書き込みとも呼ばれる)
save 出力ファイル名 変数名 -ascii |
出力ファイル名の拡張子: .mat
以外とする。 例えば, .asc, .txt, .dat
.matは,Matlab独特のバイナリ・ファイルの拡張子専用です。
変数名: 出力したいデータが入っている変数名が複数ある場合には,それらを
空白で区切って横に並べる。
ascii オプション:
save ... -ascii
はバイナリの代わりに8桁のascii書式を使う。
save ... -ascii
-double は,16桁のascii書式を使う。
save ... -ascii
-tabs は,タブで区切る。
save ... -ascii
-double -tabs は,16桁で,タブで区切ったものである。
データファイルの入力(読み込みとも呼ばれる)
loadコマンドのhelpを参照すると,以下のように記述できそうですが,このように
用いるとエラーが発生します。
(誤)
s=load 入力ファイル名 変数名 |
次のように,先頭のs=と最後の変数名を省略して用いて下さい。
(正)
load 入力ファイル名 |
この場合,データは入力ファイル名からピリオド以下の拡張子を除いたファイル名
に読み込まれます。即ち,拡張子を除いたファイル名が読み出したデータの変数名
となります。
(注意)
変数名: 変数名は省略して用いてください。 helpに記述されている次の記述
「省略されない場合 load
入力ファイル名 x は,x のみをロードします。
load 入力ファイル名
x y z は,指定した変数をロードします。」
にならうと,エラーとなります。
また,次のhelpの説明
「s = load(...) は,入力ファイル
の内容を変数名 s に出力します。」も s=を付けると
エラーが発生します。それゆえ,s=も省略して用いて下さい。
(b) フォーマット付きアスキーファイル
データファイルの出力
fid=fopen('出力ファイル名','w') %ファイル名 fprintf(fid,'出力ファイルのタイトル\n\n') %タイトルの記入,空白1行設定 fprintf(fid,'変換指定子 \n',出力変数名) %データの書き込み fclose(fid) |
1行目: fopen文で出力ファイル名を' 'で囲み与える。ただし,拡張子は.mat
以外とする。
wは書きこみモードでの使用を意味する。fidは
file identifier の略でファイル識別子
と呼んでいる。fidは,オープンしたファイルにアクセスする際,入出力関数の引数と
なる。
2行目: 文字列の書き込みでタイトルを付けない場合には省略。\nは復帰改行の意味
で,この例ではタイトルを付けた後で2回復帰改行している。なお,これらは,' '
で囲み与える。
3行目: fprintf文は書式付きデータを書き込むときに使う。変換指定子とは,%d %6.2f %g
などで,テキストpp.55,56参照のこと。出力変数名とは,出力したいデータが入って
いる変数名のこと。当然のことながら出力変数名には事前にこの文を実行する前
に値が代入されていること。出力変数が複数個ある場合には,変数をカンマ(,)で
区切って横に並べる。
4行目: 書き込みが終了したら,fclose文でfidで指定される該当ファイルを閉じる。
データファイルの入力
fid=fopen('入力ファイル名','r') title=fgets(fid) [入力変数名,count]=fscanf(fid,'変換指定子',入力サイズ) fclose(fid) |
1行目: rは読み込みモードでの使用を意味する。
2行目: 1行分の文字列データを変数名titleに読み込む(復帰改行を含む)。即ち,識別
子fidをもつファイルの1行分をMatlab文字列としてtitleに代入する。
3行目:入力変数名に読み込まれたデータが代入される。countには読み込まれたデータ
数が返される。変換指定子には,全長桁数.小数点以下桁数を省いた%f,%e
などを指定する。入力サイズには,例えば2行11列で入力変数名に代入したい
場合には,[2 11]と書く。[2 inf]と書くと,変換指定子が一致している限り,ファイル
の終端子(EOF)まで読み込みを続ける。1行5列の入力サイズの場合には,
[1 5]または単に 5 と記述すればよい。
なお,ExcelのCSVファイル(テキストデータ)は,fscanfで読込できる。
4行目: 読み込みが終了したら,fclose文でfidで指定される該当ファイルを閉じる。
サンプル
name='c:la21acc.txt'
fid=fopen(name,'r');
[DDY,count]=fscanf(fid,'%g',[6
inf]);
fclose(fid)
注意: 入力データの変換指定子は,必ず出力ファイルの変換指定子に一致させる。
ただし,桁数の指定は省略する。通常はデータのサイズも一致させる。
(2) バイナリファイル
バイナリファイルは2進数で表現されたデータファイルなので,テキストエディターでそれを
開いて見ることは出来ない。
データファイルの出力
fid=fopen('出力ファイル名','w') fwrite(fid,出力変数名,'データの型') fclose(fid) |
2行目: 出力変数名とデータの型を指定する。
サンプル
fid=fopen('cktemp.bin','w');
:
:
fwrite(fid,ck(1:ni),'float64');
:
fclose(fid);
データファイルの入力
fid=fopen('入力ファイル名','r') 入力変数名=fread(fid,入力サイズ,'データの型') fclose(fid) |
サンプル
fid=fopen('cktemp.bin','r');
:
:
[ck,count]=fread(fid,m2,'float64');
%m2にあらかじめ入力サイズが代入されていることを
%前提とした場合
:
:
fclose(fid);
注意: 入力データの型は,必ず出力ファイルのデータの型に一致させる。
通常はデータのサイズも一致させる。
その他
・ 通し番号の付いた連続ファイルを読み込むサンプル
frnum=3;
for iframe=1:frnum
frn=num2str(iframe);
s1=strcat('file_ex_',frn,'.bmp');
[Y,map]=imread(s1); %画像データの入力例
[m,n,k]=size(Y);
figure(ifig)
ifig=ifig+1;
clf
subplot(2,2,1)
imagesc(Y)
:
:
end
・ 作成した出力ファイルの確認
コマンド uiimport を入力,またはファイル/データのインポートをクリックして,
Import Wizard を起動させる。ファイル名を入力するフィールドに該当の出力
ファイル名を入れ,Enterキーを押すとImport Wizardで確認できる。
または,エクスプローラを用いても確認できる。
プログラミングのトップページへ戻る