2016-07-21 20 views
1

目的は、無損失でMatlabからデータを保存して交換することです。ファイルから16進数の2倍のデータを効率的に読み込むには?

>> a 
a(:,:,1) = 
    0.8147 0.1270 0.6324 
    0.9058 0.9134 0.0975 
a(:,:,2) = 
    0.2785 0.9575 0.1576 
    0.5469 0.9649 0.9706 

は、我々はファイル

fp = fopen('test.dat','w'); 
fprintf(fp, '%bX ',a); 

に16進数などのデータを保存し、ターンでは、我々はこれらを読む必要が

3FEA1237688ABA7B 3FECFC3F5F570C7D 3FC0411A9F807B7C 3FED3A6000E256BF 3FE43C49753B9024 3FB8F8687182D4C0 3FD1D2EA3181CE68 3FE1800DABF8B5E0 3FEEA3E55FFC605B 3FEEE05DEBDEEB6B 3FC42CAA5B9D0950 3FEF0F1897ECA804 

得ることができます。たとえば、double配列を与えられましたデータをMatlabに正しく入力してください。ただし、fscanf()には対応する "%bX"形式はありません。私が検索しましたし、それを一つ一つを行うことができます:

for k = 1 : xx 
    tmp = fscanf(fp,'%s ',[1 1]); 
    b(k) = hex2num(tmp); 
end 

それが効率的にMATLABにこれらのデータを読み込む方法については、特に大規模なデータのための効率的ではないので?むしろループより

答えて

3

、私は単に、freadを使用してファイル全体を読み取る進から各要素を変換するために各進数が要素である文字列のセル配列を作成し、hex2numを使用するstrsplitを使用して、すべてのスペースでそれを分割することになりますダブルに。

fid = fopen('filename.dat', 'r'); 
numbers = hex2num(strsplit(fread(fid, '*char').')); 
fclose(fid); 

更新

あなたはstrsplitを持っていない場合、あなたはあなたのための分割を行うためにregexpを使用することができます。

numbers = hex2num(regexp(fread(fid, '*char').', '\s+', 'split')); 

、別のオプションは、

data = textscan(fid, '%s'); 
numbers = hex2num(data{1}); 
+0

はあなたに感謝し、当社の各16進数を解析するtextscanを使用することです。関数strsplit()は新しいバージョンのMatlabにのみ存在するようです。 – lxg

+0

@lxg古いバージョンの代替として更新されました。 – Suever

+0

ありがとう!今はとても速いです。 – lxg

関連する問題