首页 > 解决方案 > 对于parfor,表格的垂直连接太慢了

问题描述

我在垂直连接表格时遇到速度问题,每个表格都是 parfor 循环的一部分。

这就是我所做的:

T = table(group1, group2, val1, val2, ...);
T = sortrows(T, {'group1', 'group2'}); % possible speed gains from sorting?
[Pairs, idx] = unique([T.group1, T.group2], 'rows');

idx1 = [idx; height(T)+1]; % to include the last index
idx2 = idx1(2:end) - 1;
idx1 = idx1(1:end-1);

T_ = [];
parfor i=1:length(Pairs)
    tmpIdx = idx1(i):idx2(i);
    T_ = T(tmpIdx, :);
    T__ = myFun(T_);
    T_ = [T_; T__];
end

function T_out = myFun(T_in)
    vlist = T_in.Properties.VariableNames;
    T_out = T_in(:, vlist) % preallocation

    % overwrite values
    for i = 1 : length(vlist)
        T_out.vlist(2:end, i) = T_in{1:end-1, vlist{i}};
    end
end

在里面myFun(),我做了一些计算T.val1, T.val2...。但是,上面太慢了。我检查了分析器,发现大部分时间都花在了

1) T_=T(tmpIdx, :)( tabular.vertcat)

2)T_out.vlist(2:end, i) = T_.vlist{1:end-1, vlist{i}}myFun( tabular.subsasgn, tabular.subsref)

对于 1),尽管速度很慢,但我想切片T是不可避免的,因为我正在计算具有唯一对的值T.group1T.group2

虽然主要问题是 1),但花在 2) 上的时间也很重要。

有什么好的改进想法吗?任何评论/建议都会非常有帮助。

标签: matlab

解决方案


推荐阅读