編輯: 所以最後做出來,尊重的確切順序和變量的類型的最快方法是的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