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



我正在尝试提高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
许多谢谢。

如果有足够的内存,您可以在这里使用几种方法。

方法#1: With bsxfun &permute——

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

方法#2: With pdist &squareform——

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;

对于性能,我打赌是方法#3!

最新更新