用matlab编写multiprecision二进制文件
问题描述:
我想写一个1整数的表格,然后是二进制格式的3个双打表格。 当然我可以做一个for循环用matlab编写multiprecision二进制文件
for i=1:sz
fwrite(fid, integ(i), 'int');
fwrite(fid, doubl(i,:), 'double');
end
但是这是有几百万条目阵列相当缓慢。 什么是最有效的方式来处理这个(不必写一个.mex)?
不幸的是我必须保留这个[int32 float64 float64 float64]格式,因为这是一个程序使用的文件格式规范。
答
编辑: 所以最后做出来,尊重的确切顺序和变量的类型的最快方法是的nx3 double
表转换成(2xn)x3 int32
数组,改造并串连那么阵列一气呵成写的一切。
outfile4 = 'test1.bin' ;
tic4 = tic ;
% // reshape everything
table2write = int32(zeros(2*nCol+1,nPt)) ;
table2write(1,:) = integ.' ; %'
for k=1:nCol
ixLine = (k-1)*2+2 ;
table2write(ixLine:ixLine+1 , :) = reshape(typecast(doubl(:,k),'int32') , 2 , []) ;
end
% // write
fid = fopen(outfile4 , 'w') ;
count = fwrite(fid , table2write , 'int32') ;
fclose(fid) ;
elapsed4 = toc(tic4)
其导致:
elapsed4 =
0.794346687070910
阅读下面测试以查看变量的定义和稍快的方法,但其变形阵列
原来的答案:
如果你有能力重组你的文件,你可以获得大量的时间。
请看下面的例子:
outfile1 = 'E:\TEMP\Z_ToDelete\test1.bin' ;
outfile2 = 'E:\TEMP\Z_ToDelete\test2.bin' ;
nPt = 0.5e6 ;
integ = int32(randi(32000,nPt,1)) ;
doubl = rand(nPt,3) ;
%% // Write to file with mixed precision
tic1 = tic ;
fid = fopen(outfile1 , 'w') ;
for k = 1:nPt
fwrite(fid, integ(k), 'int');
fwrite(fid, doubl(k,:), 'double');
end
fclose(fid) ;
elapsed1 = toc(tic1)
%% // write to file sequentially
tic2 = tic ;
fid = fopen(outfile2 , 'w') ;
fwrite(fid, integ, 'int');
fwrite(fid, doubl, 'double');
fclose(fid) ;
elapsed2 = toc(tic2)
在我的系统,这样的输出:
elapsed1 =
19.7780466501241
elapsed2 =
0.0309073378234669
所以让Matlab的处理您的全阵列写的,每次一个精度极高更有效而不是逐行指定要写什么。
缺点是从保存的文件中读取单个记录可能会稍微复杂一些,但是您可以轻松编写一个函数,该函数将针对给定索引读取integer
,跳过其余部分,然后阅读3x doubles
。
如果你实在不能复用/解复用你的数据,那么你可以考虑转换你的int
到double
,写全阵列:
tic3 = tic ;
A = [double(integ) doubl] ;
fid = fopen(outfile2 , 'w') ;
fwrite(fid, A, 'double');
fclose(fid) ;
elapsed3 = toc(tic3)
这仍然是很多比初始速度“混合精度”解决方案
elapsed3 =
0.483094789081886
当您阅读它们时,将它们转换回整数的时间比您花费的时间更短混合精度值。这种方法唯一的缺点是文件大小略有增加(约14%)。
谢谢你的帮助!不幸的是,这是一个现有的文件格式,需要我写[int32 float64 float64 float64]的其他程序读取。也许我可以逐个字节地生成一个数组并一次写入它? – serigado 2014-10-17 22:46:30
@serigado。是的,这是最后的手段。我希望你不必去那里,但实际上你最后的机会是将_bit中的每一个'double'转换成类似于_'int32'的二列,然后一次性地将整个表格'fwrite'。 – Hoki 2014-10-17 22:49:50
使用num2hex,拆分和应用hex2dec比较慢,即使它很酷。我不相信有没有办法加速这一点。 – serigado 2014-10-17 23:09:17