我有下面一段代码,从一个数据集(“数据”)计算百分位数非常慢,因为输入矩阵很大(“数据”大约有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

最佳答案

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

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

prctile在一次调用中计算201个百分点所花费的计算时间大约相当于原始代码的两次迭代首先是因为prctile以这种方式更快,其次是因为accumarray现在只调用一次。

07-26 08:07