Matlab 对于parfor,表的垂直连接太慢
我遇到了表的垂直连接的速度问题,每个表都是parfor循环的一部分 我是这样做的:Matlab 对于parfor,表的垂直连接太慢,matlab,Matlab,我遇到了表的垂直连接的速度问题,每个表都是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 in
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}
insidemyFun
(tabular.subsasgn,tabular.subsref
)
对于1),尽管速度很慢,我想切片T
是不可避免的,因为我正在计算T.group1
和T.group2
的值w.r.T.唯一对
虽然主要问题是1),但花在2)上的时间也很重要
有改进的好主意吗?任何评论/建议都会非常有用。尽管我非常喜欢使用表(主要是因为易于识别列),但根据我的经验,索引到表中的速度很慢,如果必须索引到表中的次数超过几次,最好将数据复制到矩阵中(假设表中的所有数据都是数字)操作矩阵,然后在最后重建一个输出表。谢谢你在这里的注释@PhilGoddard.
N>1e+4
,它看起来足够大了。也许我应该将表拆分为字符串和数字,用数字进行计算,并在末尾添加标签。尽管我非常喜欢使用表(主要是因为易于识别列),根据我的经验,索引到列中的速度很慢,如果必须索引到列中超过几次,则最好将数据复制到矩阵中(假设表中的所有数据都是数字)操作矩阵,然后在最后重建一个输出表。感谢您在这里的注释@PhilGoddard.N>1e+4
,它似乎足够大。也许我应该将表拆分为字符串和数字,用数字进行计算,并在末尾添加标签。