【问题标题】:Improve code / remove for-loop when using accumarray MATLAB使用 accumarray MATLAB 时改进代码/删除 for 循环
【发布时间】:2016-05-05 20:44:01
【问题描述】:

我有以下代码从数据集(“DATA”)计算百分位数非常慢,因为输入矩阵很大(“Data”长约 500.000,从“指数”)。

是否有可能/建议使这段代码更高效?例如,我可以以某种方式省略 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

【问题讨论】:

  • 请注意:accumarray 无论如何都是循环的包装器。
  • Fractile 似乎是一个矩阵,你到底想做什么?通常,如果您想摆脱 for 循环,可以尝试将其设为矩阵运算,matlab 非常好(但请记住内存限制)
  • 是的,它确实是一个矩阵。我正在为每个唯一的 10080 索引存储单独的百分位数结果 (0:0.5:100)。

标签: matlab vectorization percentile accumarray


【解决方案1】:

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

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

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

【讨论】:

  • 非常感谢,这正是我想要的。易于理解且速度更快!
猜你喜欢
  • 2021-05-10
  • 2018-11-20
  • 2014-08-13
  • 1970-01-01
  • 1970-01-01
  • 2011-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多