web-dev-qa-db-ja.com

Matlabのバイナリファイルとの間で読み取りおよび書き込みを行う

私のmatlabの知識は、単に知る必要があるだけなので、これはおそらく基本的な質問です。それにもかかわらず、ここに来ます:

バイナリ形式で保存されたデータ(16ビット整数)を含むファイルがあります。それをmatlabのベクトル/配列に読み込むにはどうすればよいですか?このデータをmatlabのファイルに書き込むにはどうすればよいですか?大量のデータ(ギガバイト)の読み取り/書き込み時のパフォーマンス速度を向上させるためのスマートな調整はありますか?

15
AnnaR

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];

データの書き込み

データをファイルに書き込むことについて。 Bill's answerのコマンドfwriteは、バイナリファイルに書き込みます。データをテキストファイルに書き込みたい場合は、dlmwriteを使用できます。

>> dlmwrite('data.csv',A,',');

参考文献

[1] http://en.wikipedia.org/wiki/Endianness

更新

  1. マシンフォーマット(IE、ieee-beieee-le、バイナリデータのvaxdなど)は、fopenのいずれかで指定できます。 )またはMatlabのfreadコマンド。サポートされているマシン形式の詳細は、Matlabのfopenのドキュメントに記載されています。

  2. Scott French's コメント Bill's answer は、データをint16変数に読み込むことを提案します。これを行うには

    >> A = int16(fread(fid,count,precision,machineFormat));
    

    ここで、countは、読み取るデータのサイズ/形状です。precisionはデータ形式であり、machineformatは各バイトのエンコーディングです。

  3. ファイル内を移動するには、コマンドfseekを参照してください。例えば、

    >> fseek(fid,0,'bof');
    

    bofファイルの先頭を表す先頭にファイルを巻き戻します。

16
Azim

ファイルに格納した値の数がわかっている場合は、次のようにしてデータを配列に読み込むことができます。

fid = fopen('data.bin','rb')
A = fread(fid, count, 'int16')

ファイルにデータを書き込むには、次のようにします。

fid = fopen('data.bin','w')
count = fwrite(fid, A, 'int16')

Fwrite関数は、ファイルに書き込まれた要素(バイトではない)の数を返します。

パフォーマンスチューニングに関する限り、データをチャンクで読み取って、処理する必要がある分だけ使用することができます。これはどの言語でも同じであり、Matlabに固有の速度を上げる方法はありません。

10
Bill the Lizard

私は通常、応答にリンクが表示されるのを嫌いますが、これはかなり近いように見えます。

http://www.mathworks.com/support/tech-notes/1400/1403.html

パフォーマンスチューニングの2番目の部分については、Matlabを使用してから6年が経過しているので、わかりません。

HTH

0
Anthony Potts