Matlabのバイナリファイルの読み取りと書き込み
質問
matlabの私の知識は単に知る必要があるだけなので、これはおそらく基本的な質問です。それにもかかわらず、ここに来ます:
バイナリ形式で保存されたデータ(16ビット整数)を含むファイルがあります。 matlabのベクトル/配列に読み込むにはどうすればよいですか?このデータをmatlabのファイルに書き込むにはどうすればよいですか?大量のデータ(ギガバイト)を読み書きする際のパフォーマンス速度を向上させるためのスマートな調整はありますか?
解決
Bill the Lizard が書いたようにfreadを使用してデータをベクターにロードできます。彼の答えを少しだけ広げたいと思います。
データの読み取り
>> fid=fopen('data.bin','rb') % opens the file for reading
>> A = fread(fid, count, 'int16') % reads _count_ elements and stores them in A.
コマンド fopen および fread のデフォルトは、整数のリトルエンディアン[1]エンコーディングです。ファイルがビッグエンディアンでエンコードされている場合、 fread を
に変更する必要があります>> A = fread(fid, count, 'int16', 'ieee-be');
また、ファイルセット全体を読み取る場合
>> count=inf;
また、データを n 列のマトリックスに読み込む場合は
>> count=[n inf];
データの書き込み
データをファイルに書き込むことに関して。
>> dlmwrite('data.csv',A,',');
参照
[1] http://en.wikipedia.org/wiki/Endianness
更新
-
マシン形式(IE、 ieee-be 、 バイナリデータの ieee-le 、 vaxd など)は、 Matlabの fopen または fread コマンド。サポートされる詳細 マシン形式は Matlabの fopen のドキュメント。
-
スコット・フレンチのコメントへの Bill's 回答 にデータを読み込むことを提案します int16変数。これを行うには
>> A = int16(fread(fid,count,precision,machineFormat));
ここで、 count はサイズ/形状 読み込むデータ、精度は データ形式、および machineformat 各バイトのエンコードです。
-
ファイルを移動するには、コマンド fseek を参照してください。たとえば、
>> fseek(fid,0,'bof');
は、 bof が begining of file を表す先頭までファイルを巻き戻します。
他のヒント
ファイルに保存されている値の数がわかっていると仮定すると、このようなことを実行してデータを配列に読み込むことができます。
fid = fopen('data.bin','rb')
A = fread(fid, count, 'int16')
ファイルにデータを書き込むには、次の操作を行います。
fid = fopen('data.bin','w')
count = fwrite(fid, A, 'int16')
fwrite関数は、ファイルに書き込まれた要素(バイトではない)の数を返します。
パフォーマンスチューニングに関する限り、処理に必要な分だけ使用するために、データをチャンクで読み取ることができます。これはどの言語でも同じであり、Matlab固有の高速化する方法はありません。
通常、応答にリンクが表示されるのは嫌ですが、これはかなり似ています:
http://www.mathworks.com/support/tech -notes / 1400 / 1403.html
パフォーマンスチューニングの2番目の部分については、Matlabを使用してから6年が経過しているため、わかりません。
HTH