在Matlab中加速表过滤

问题描述 投票:2回答:1

A成为Matlab中的表格。是否有quick方法访问此表的子集?说出某列包含某个范围或类似范围内的数字的所有条目。问题是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),:)

matlab performance dataframe
1个回答
0
投票
不,您做对了。

A(some_logical_index,:)是传统的AFAIK最快的方法,它可以对table的行进行子集化。 A.col1 == i产生一个逻辑索引,并且由于您要分别对每个组应用一个函数,因此一次可以这样做是合理的。或者,如果您的组基于一组键,则ismember(A.col1, x)(其中x是可能为非标量的数组)是常规的方法,并且可能是最快的方法,并且还会生成逻辑索引。]

还有Matlab提供的groupsummary函数,它是您正在执行的此循环的“向量化”版本:它按列值对表进行分组,并将提供的函数应用于各组以产生输出。这可能是表达您在这里所做的工作的一种更简洁的方式。

理论上

,这可能会更快,因为Matlab可以使用其内部线程来加速它。但是实际上,在我的测试中,groupsummary的执行速度仅与常规M代码组的循环速度相同。可能是您想做的事情,以防Matlab在将来加速这一步,但您现在不会看到任何胜利(从Matlab R2019b开始)。如果表包含齐次的列-所有数字或所有字符串或同一类的所有对象-您可以通过将表转换为数字,单元格或字符串类型的纯矩阵来加快此过程。这样可以避免table类的开销。

您可以通过“投影” A中未在FancyFunction计算中实际使用的所有列来获得较小的加速:将数组A按列子集化为[[ C0];这样,您就无需花费时间和内存来子集任何不需要的列。

© www.soinside.com 2019 - 2024. All rights reserved.