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