performance - 根据欧氏距离对点进行分类 - 优化代码

标签 performance matlab

我有一个矩阵 A,由 200 个大小为 d 的向量组成。

我希望由 4096 个向量组成的矩阵 B 根据最近距离规则分类到这些点。

因此,结果应该包含大小为 B 的行,并具有其所属的 id 号(从 1 到 200)。

我通过 2 for 循环编写了这段代码,计算需要大量时间。

for i = 1:4096
        counter = 1;
        vector1 = FaceImage(i,:);
        vector2 = Centroids(1,:);
        distance = pdist( [ vector1 ; vector2] , 'euclidean' );
        for j = 2:200
              vector2 = Centroids(j,:);
              temp = pdist( [ vector1 ; vector2] , 'euclidean' );
              if temp < distance
                    distance = temp;
                    counter = j;
              end
        end
        Histogram( i ) = counter;
end

有人可以帮助我提高上述代码的效率...或者建议我一个内置函数吗?

谢谢

最佳答案

您可以使用 pdist2 在一行中完成此操作:

[~, Histogram] = pdist2( Centroids, FaceImage, 'euclidian', 'Smallest', 1);

原始代码的时间:

FaceImage = rand(4096, 100);
Centroids = rand(200, 100);

tic
* your code *
toc

Elapsed time is 87.434877 seconds.

我的代码的时间:

tic
[~, Histogram_2] = pdist2( Centroids, FaceImage, 'euclidean', 'Smallest', 1);
toc

Elapsed time is 0.111736 seconds.

断言结果相同:

>> all(Histogram==Histogram_2)

ans =

   1

关于performance - 根据欧氏距离对点进行分类 - 优化代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9862877/

相关文章:

MySQL对某些特定值的慢查询(股票数据)

c++ - try-catch block 是否会降低性能

matlab - 为向量输入定义多变量函数

performance - MATLAB 中的矢量化循环

java - 从列表中删除具有相同内容(自定义 .equals() )的重复项的快速方法

performance - 在 elastic beanstalk 上运行 Golang 应用程序时是否存在任何性能问题?

matlab - 如何匹配查找函数matlab中使用的矩阵元素数

matlab - 将空矩阵分配给Matlab中的空子矩阵

matlab - 在外部 for 中使用 parfor 的两个循环错误

python - Mxnet - 慢速数组复制到 GPU