2016-07-21 32 views
1

其目的是無損地保存和交換來自Matlab的數據。例如,給定一個雙數組:如何從文件中有效讀取十六進制雙精度數據?

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

,並得到

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

反過來,我們需要閱讀這些數據正確地轉化爲Matlab。但是,fscanf()中沒有相應的「%bX」格式。我已搜查,並能做到一個接一個:

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

因爲它是沒有效率特別適用於大數據,如何在這些數據中有效地讀取到Matlab?

回答

3

而不是循環,我將簡單地讀取整個文件使用fread,使用strsplit創建字符串單元陣列,其中每個十六進制數是一個元素,然後使用hex2num從十六進制的每個元素轉換它在所有的空間分割到一倍。

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

更新

如果沒有strsplit,則可以使用regexp做拆分爲您服務。

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

而另一種選擇是使用textscan解析我們的每一個十六進制數

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

謝謝。似乎函數strsplit()只存在於新版本的Matlab中。 – lxg

+0

@lxg更新了舊版本的替代版本。 – Suever

+0

謝謝!現在很快。 – lxg