使用accumarray MATLAB时改进代码/删除for循环

时间:2016-01-28 12:53:59

标签: matlab vectorization percentile accumarray

我有以下代码来计算数据集(“DATA”)的百分位数非常慢,因为输入矩阵很大(“数据”大约500.000长,10080个唯一值分配自“指数“)。

是否有可能/建议使这段代码更有效率?例如,我可以以某种方式省略for循环吗?

k = 1;
for i = 0:0.5:100; % in 0.5 fractile-steps
     FRACTILE(:,k) = accumarray(Indices,Data,[], @(x) prctile(x,i));
     k = k+1;
end

1 个答案:

答案 0 :(得分:7)

使用相同的数据一次又一次地调用prctile会导致性能问题。为每个数据集调用一次:

FRACTILE=cell2mat(accumarray(Indices,Data,[], @(x) {prctile(x,[0:0.5:100])}));

prctile在一次通话中评估您的201百分位数的成本大约与原始代码的两次迭代一样多。首先是因为prctile这种方式更快,其次因为accumarray现在只调用一次。