如何有效地从文件中读取十六进制双数据?

时间:2016-07-21 02:25:35

标签: matlab

目的是无损地保存和交换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?

1 个答案:

答案 0 :(得分:3)

我不是循环,而是简单地使用fread读取整个文件,使用strsplit在所有空格中拆分它以创建字符串的单元格数组,其中每个十六进制数字是一个元素,然后使用hex2num将每个元素从十六进制转换为double。

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