我想将异构二进制数据读入matlab。我从一开始就知道它有多少以及每个段的数据类型。例如:
%double %double %int32 ...
然后重复大约一百万次。使用fread
可以轻松处理,因为知道每个段的咬合次数,因此可以计算每行的跳过值。
但现在数据段看起来像这样:
%double %int32%*char %double %double ...
因此int
之前的*char
是所述字符串的长度。这带来了我无法再计算跳过的问题而且我一直在逐行读取整个文件,因此需要进行更多的文件访问并减慢速度。
为了获得至少一些加速,我不想一次读取所有%double %double ...
(大约30个元素),然后使用缓冲区中的那些来填充数组。在C中,这将是一个相当容易的任务,没有memcpy,也不能直接访问指针...
你知道如何实现这一点,而不是使用mex文件吗?
答案 0 :(得分:1)
您无法解决记录大小未知的问题,因此您不知道提前阅读了多少。但是你可以批量读取,如果你有一个合理的字符串最大大小,你总是可以读取该数量,并忽略最后不需要的字节。 typecast
就是诀窍:
readlen = 1024;
buf = fread(fid, readlen, '*uint8'); % the asterisk keeps the returned array as uint8
rec.val1 = typecast(buf(1:8), 'double');
string_len = typecast(buf(9:12), 'int32');
rec.str1 = typecast(buf(13:13+string_len-1), 'uint8');
pos = 13+string_len;
rec.val2 = typecast(buf(pos:pos+8-1), 'double');
您可以围绕此技术包装一个简单的函数来自动跟踪当前偏移量。