簡體   English   中英

在 Matlab 中加速表格過濾

[英]Speed up table filtering in Matlab

A為 Matlab 中的一張表。 是否有一種快速訪問該表子集的方法? 假設某一列包含某個范圍內的數字等的所有條目。 問題是A非常大,我經常評估A(A.col1 == i,:)

然后我使用以下簡化代碼

B = zeros(1,N);
for i=1:N
     temp = A(A.col1 == i,:);      % this line is evaluated often and takes a lot of time since A is big table
     B(i) = FancyFunction(temp);
end

那么,是否有A(A.col1 == i,:)A(ismember(A.col1,x),:)快速替代方案?

不,你做得對。

A(some_logical_index,:)是對table行進行子集化的常規方法,也是 AFAIK 最快的方法。 A.col1 == i生成一個邏輯索引,並且由於您將一個函數分別應用於這些組中的每一個,因此一次執行一個是合理的。 或者,如果您的組基於一組鍵,則ismember(A.col1, x) ,其中x可能是非標量數組,是常規且可能是最快的方法,並且還會生成邏輯索引。

還有由 Matlab 提供的groupsummary函數,它是您正在執行的此循環的“矢量化”版本:它按列值對表進行分組,並將提供的函數應用於組以產生輸出。 這可能是一種更簡潔的方式來表達您在這里所做的事情。 理論上,這可能會更快,因為它可以由 Matlab 使用其內部線程加速。 但在實踐中,在我的測試中, groupsummary執行速度僅與組上的常規 M 代碼循環一樣快。 可能是您想要做的事情,以防 Matlab 在未來加速,但您現在看不到任何勝利(從 Matlab R2019b 開始)。

如果您的表包含同構列 - 全部是數字或所有字符串或同一類的所有對象 - 您可以通過將表轉換為數字、單元格或字符串類型的普通矩陣來加快速度。 這將避免table類開銷。

您可以通過“投影” A中實際未在FancyFunction計算中使用的任何列來獲得較小的加速:將數組A FancyFunction集為FancyFunction所需的FancyFunction 這樣你就不用花時間和內存來對任何不需要的列進行子集化。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM