Algorithm MATLAB聚类算法中for循环的去除

Algorithm MATLAB聚类算法中for循环的去除,algorithm,performance,matlab,cluster-analysis,vectorization,Algorithm,Performance,Matlab,Cluster Analysis,Vectorization,我试图改进光学聚类算法的性能。我在开源中发现的实现对每个示例都使用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 非常感谢。有了足够的

我试图改进光学聚类算法的性能。我在开源中发现的实现对每个示例都使用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

非常感谢。

有了足够的RAM,您可以在这里使用一些方法

方法#1:带&-

方法#2:-

接近#3-


就性能而言,我的赌注是方法#3

for循环可能不是问题所在。您是否尝试过探查器以查看瓶颈在哪里?我建议使用小版本的x,并将行中的每个函数分开。然后探查器会告诉你哪个部分花费的时间最多。你也会创建一行全零,然后自平方,然后求和。使用2个循环和避免repmat可能会更快,以利于在非零行上进行操作。另外,您是否预先分配了D数组?为了获得性能,您确实需要使用索引。尝试ELKI版本,启用k-d树或类似索引,然后使用足够大的ε运行光学。您会对性能差异感到惊讶!我只有八度音阶而不是Matlab,但ELKI的速度快了100倍到1000倍。这对减少运行时间有帮助吗?请看我下面的回复。首先,谢谢你的回复。我已经测试了你的所有方法,它们都给出了相同的结果,但可惜的是,它与原始算法得到的结果不同。我会试着调试它,也许你也可以试一下。我可以证明,它们确实要快得多,大约100%的计算能力。顺便说一句,我+1d你的链接方法,因为它提供了信息。好吧,再弄乱一些。版本1给出了完全相同的结果,版本2给出了一个可忽略的错误。两个版本的运行时间与我的版本大致相同。版本3确实是最快的,但仍然会产生错误。我正在进一步研究它。让版本3工作,与数据集相比差异可以忽略不计。产生错误的原因是,我必须猜测您所说的变量“M”是什么意思,我在描述中没有使用它(我猜它是“M”,它是“x”)。唯一剩下的问题是,第一列产生了小的负数,它应该等于0。我手动将其归零,但我将更深入地研究这一点,并理解您的方法。谢谢。@user2324712抱歉是的,
M
一定很混乱。基本上,这些对角线值与精确的零稍有偏差,因此这条线
D(1:m+1:end)=0更正它。编辑方法#3,以纠正混淆的
M
部分。请检查一下!
D = squeeze(sum(bsxfun(@minus,permute(x,[3 2 1]),x).^2,2))
D = squareform(pdist(x).^2)
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;