3

我有以下代码从数据集(“DATA”)计算百分位数非常慢,因为输入矩阵很大(“Data”大约长 500.000,从“Indices”分配了 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
4

1 回答 1

7

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

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

prctile在一次调用中评估 201 个百分位数的计算时间与原始代码的两次迭代大致相同。首先是因为prctile这种方式更快,其次是因为accumarray现在只调用一次。

于 2016-01-28T13:10:44.300 回答