2014-10-17 123 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