使用 accumarray MATLAB 时改进代码/删除 for-loop
Improve code / remove for-loop when using accumarray MATLAB
我有以下代码从数据集 ("DATA") 计算百分位数非常慢,因为输入矩阵很大("Data" 大约有 500.000 长10080 个从 "Indices" 分配的唯一值)。
有没有possibility/suggestions可以让这段代码更高效?例如,我可以以某种方式省略 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
现在只调用一次。
我有以下代码从数据集 ("DATA") 计算百分位数非常慢,因为输入矩阵很大("Data" 大约有 500.000 长10080 个从 "Indices" 分配的唯一值)。
有没有possibility/suggestions可以让这段代码更高效?例如,我可以以某种方式省略 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
现在只调用一次。