2014-01-29 155 views
1

我想讀取非均勻二進制數據到matlab中。我從一開始就知道它是多少以及每個細分類型的數據類型。例如:Matlab讀取異源二進制數據

%double %double %int32 ... 

然後重複大約一百萬次。易於使用fread進行處理,因爲知道每個片段的咬合數量,因此可以計算每行的跳過值。

但現在的數據段看起來是這樣的:

%double %int32%*char %double %double ... 

由此int*char是說字符串的長度。這帶來了我無法再計算跳過的問題,而且我一直在逐行閱讀整個文件,因此需要做更多的文件訪問並減慢了轉換速度。

爲了獲得至少一些加速度,我一次不會讀取所有%double %double ...(大約30個元素),然後使用緩衝區填充數組。在C這將是一個相當容易的任務在這裏,沒有memcpy和不直接訪問指針...

你知道任何方式來實現這一點,不使用mex文件?

+1

我不認爲有一個內建函數,它可以理解爲「讀取這個int所告訴你的字符數」。有了這種格式的「動態性」,我猜重複的freads是唯一的選擇。 – sebastian

+0

另一個想法:如果你對格式有影響,你可能會考慮存儲固定長度的字符,如果需要填充較短的char數組。這僅適用於char數組全部在一定長度內的情況... – sebastian

+0

@sebastian。不幸的是,我對這方面沒有任何控制。它幾乎是固定的。否則,我會選擇像HDF5這樣的東西,我不必處理所有這些... –

回答

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'); 

你可能環繞這種技術簡單的函數來跟蹤當前自動偏移。

+0

非常好。我不知道在MATLAB中存在類型轉換。謝謝 –