質問

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

データの書き込み

データをファイルに書き込むことに関して。 fwrite > Bill's の回答はバイナリファイルに書き込みます。データをテキストファイルに書き込む場合は、 dlmwrite

を使用できます
>> dlmwrite('data.csv',A,',');

参照

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

更新

  1. マシン形式(IE、 ieee-be 、 バイナリデータの ieee-le vaxd など)は、 Matlabの fopen または fread コマンド。サポートされる詳細 マシン形式は Matlabの fopen のドキュメント。

  2. スコット・フレンチのコメントへの Bill's 回答 にデータを読み込むことを提案します int16変数。これを行うには

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

    ここで、 count はサイズ/形状 読み込むデータ、精度は データ形式、および machineformat 各バイトのエンコードです。

  3. ファイルを移動するには、コマンド 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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top