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

Remove for loop from clustering algorithm in MATLAB

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

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

代码如下:

x 是数据:[mxn] 数组,其中 m 是样本大小,n 是特征维数,大部分时间显着大于一。

[m,n] = size(x);

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

非常感谢。

有足够的 RAM 可以玩,这里可以使用一些方法。

方法 #1: 使用 bsxfun & permute -

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

方法 #2: 使用 pdist & squareform -

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

方法#3 matrix-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!