15

matlab に関する私の知識は単に知る必要があるため、これはおそらく初歩的な質問です。それにもかかわらず、ここに来ます:

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

4

3 に答える 3

16

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.

コマンドfopenfreadは、デフォルトで整数のリトルエンディアン [1] エンコーディングになります。ファイルがビッグエンディアンでエンコードされている場合は、freadを次のように変更する必要があります。

>> A = fread(fid, count, 'int16', 'ieee-be');

また、ファイル セット全体を読み取りたい場合は、

>> count=inf;

データをn列の行列に読み込む場合は、次を使用します

>> count=[n inf];

データの書き込み

ファイルへのデータの書き込みについて。Bill の回答にあるコマンドfwriteは、バイナリ ファイルに書き込みます。データをテキスト ファイルに書き込みたい場合は、dlmwriteを使用できます。

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

参考文献

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

アップデート

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

  2. Bill の回答に対するScott French のコメント は、データを int16 変数に読み込むことを提案しています。これを行うには

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

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

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

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

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

于 2008-10-15T20:07:27.203 に答える
10

ファイルに保存した値の数がわかっていると仮定すると、次のようなことを行ってデータを配列に読み込むことができます。

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

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

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

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

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

于 2008-10-15T18:14:17.477 に答える
0

私は通常、応答にリンクが表示されるのを嫌いますが、これは非常によく似ています。

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

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

HTH

于 2008-10-15T18:03:27.513 に答える