2017-04-04 38 views
1

我正在處理大文件(30GB +)中的二進制數據。 我已經用自定義閱讀功能實現了fileDatastore。matlab高數組與循環實現

fds = fileDatastore(location,'ReadFcn',@readFile); 

ReadFile函數讀取二進制數據到一個數組一次一個字節。 然後我從fileDatastore創建一個高數組。

data = tall(fds); 

這一切似乎工作正常。現在我想通過高位數組搜索一個字節模式(例如25和30)。像...

for i=1:size(data) 
    if data(i) == 25 && data(i+1) == 30 
     disp('do something') 
    end 
end 

這似乎不可能。我最終得到'從高轉換爲邏輯不可能'的錯誤。我怎麼解決這個問題?

+0

不直接相關,但你可能想要'1:numel(data)'而不是'1:size(data)' – Suever

+0

我沒有工具箱來測試自己,但我會檢查'class (data(i)== 25)'和'doc relop'作爲線索。這是可能的,你需要'和'(只有一個而不是&&)來處理你正在處理的數據類型。 –

+0

在「收集」數據之前,對「高」陣列的操作不會執行嗎?如果顯示'data(1)',你會看到文件中的值還是隻是一個'?'問號? – Justin

回答

0

基本上它看來你需要做的是遍歷數據子集,因爲實在是太有點裝入內存。例如,如果你設置了

y = gather(data(1:100)) 

然後你可以在y上而不是數據上進行比較。重要的一點是y必須適合內存,而data不適合。所以,你可能無法(例如)設置

y = gather(data)

+0

是的,這是我得出的結論,這讓我質疑Matlab的新數據類型,高數組的有用性。我認爲它比手動解析文件更容易。 – littlepho

+0

高數組適用於數據無法放入內存的情況。如果數據符合內存,那麼您不應該使用它們,因爲與僅將數據加載到標準矩陣中相比,您肯定會付出性能損失 –

2

正如excaza提到的那樣,問題是雖然data(i) == 25有效,但它不返回布爾值。所以你不能應用運算符。 簡單的解決方案似乎是嵌套if語句...

if data(i) == 25 
    if data(i+1) == 30 
     disp('do something') 
    end 
end 
+0

'&&'不是問題,或者至少不是唯一的問題。據我所知,高數組不適用於任何邏輯運算符。 @bremen_matt解決方案不起作用,因爲仍然存在'=='。 – littlepho

+0

你需要看看「收集」命令 –

0

的問題是,你不能用高大的邏輯值在循環語句的條件。這就是爲什麼錯誤是「從高轉換爲邏輯不可能」。因此,由於data(i) == 25返回邏輯高,因此您只需使用gather即可將其轉換爲內存邏輯。試試這個(因爲它可能更有效,同時收集這些):

[a,b] = gather(data(i)==25,data(i+1)==30); 
if a && b 
    disp('do something') 
end 

來源: http://www.mathworks.com/help/matlab/import_export/deferred-evaluation-of-tall-arrays.html

「例如,你不能,如果還是在使用一個高大的循環語句控制邏輯陣列,但是一旦數組通過收集進行評估, 將成爲您可以在這些 上下文中使用的內存中邏輯值。「