一尘不染

从MATLAB中的聚类算法中删除for循环

algorithm

我正在尝试提高OPTICS聚类算法的性能。我在开源中发现的实现对每个示例都使用了for循环,并且可以运行数小时…

我相信当系统具有足够的RAM量时,对repmat()函数的某些使用可能有助于改善其性能。非常欢迎您提出其他改进实施的方法。

这是代码:

x是数据:[mxn]数组,其中m是样本大小,n是特征维数,在大多数情况下,该维数显着大于1。

[m,n] = size(x);

for i = 1:m
    D(i,:) = sum(((repmat(x(i,:),m,1)-x).^2),2).';
end

非常感谢。


阅读 204

收藏
2020-07-28

共1个答案

一尘不染

有了足够的RAM来使用,您可以在此处使用几种方法。

方法一:
bsxfunpermute-

D = squeeze(sum(bsxfun(@minus,permute(x,[3 2 1]),x).^2,2))

方法2:
pdistsquareform-

D = squareform(pdist(x).^2)

方法3matrix-multiplication based euclidean distance calculations-

xt = x.';  %//'
[m,n] = size(x);
D = [x.^2 ones(size(x)) -2*x ]*[ones(size(xt)) ; xt.^2 ; xt];
D(1:m+1:end) = 0;

为了性能,我敢打赌方法三!

2020-07-28