[英]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.