2014-10-17 83 views
1

我想写一个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]格式,因为这是一个程序使用的文件格式规范。

回答

1

编辑: 所以最后做出来,尊重的确切顺序和变量的类型的最快方法是的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


如果你实在不能复用/解复用你的数据,那么你可以考虑转换你的intdouble,写全阵列:

tic3 = tic ; 
A = [double(integ) doubl] ; 
fid = fopen(outfile2 , 'w') ; 
fwrite(fid, A, 'double'); 
fclose(fid) ; 
elapsed3 = toc(tic3) 

这仍然是很多比初始速度“混合精度”解决方案

elapsed3 = 
     0.483094789081886 

当您阅读它们时,将它们转换回整数的时间比您花费的时间更短混合精度值。这种方法唯一的缺点是文件大小略有增加(约14%)。

+0

谢谢你的帮助!不幸的是,这是一个现有的文件格式,需要我写[int32 float64 float64 float64]的其他程序读取。也许我可以逐个字节地生成一个数组并一次写入它? – serigado 2014-10-17 22:46:30

+0

@serigado。是的,这是最后的手段。我希望你不必去那里,但实际上你最后的机会是将_bit中的每一个'double'转换成类似于_'int32'的二列,然后一次性地将整个表格'fwrite'。 – Hoki 2014-10-17 22:49:50

+0

使用num2hex,拆分和应用hex2dec比较慢,即使它很酷。我不相信有没有办法加速这一点。 – serigado 2014-10-17 23:09:17