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

Performance 根据欧氏距离对点进行分类-优化代码,performance,matlab,Performance,Matlab,我有一个矩阵a,由200个大小为d的向量组成 我想要一个由4096个向量组成的矩阵B根据最近距离规则分类到这些点 因此,结果应该有大小为B的行,其id号(从1到200)是它所属的 我已经通过2为循环编写了这段代码,它需要大量的计算时间 for i = 1:4096 counter = 1; vector1 = FaceImage(i,:); vector2 = Centroids(1,:); distance = pdist( [

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

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

因此,结果应该有大小为B的行,其id号(从1到200)是它所属的

我已经通过
2为
循环编写了这段代码,它需要大量的计算时间

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
i=1:4096时的

计数器=1;
vector1=人脸图像(i,:);
向量2=质心(1,:);
距离=pdist([vector1;vector2],“欧几里德”);
对于j=2:200
向量2=质心(j,:);
temp=pdist([vector1;vector2],'euclidean');
如果温度<距离
距离=温度;
计数器=j;
结束
结束
直方图(i)=计数器;
结束
谁能帮我提高上面代码的效率。。。或者建议我使用一个内置函数

谢谢

试试这个

vector2 = Centroids(1,:);
vector = [ vector2 ; FaceImage ];
temp = pdist( vector , 'euclidean' );
answer = temp[1:4096];  % will contain first 4096 lines as distances between vector2 and rows of Face Image
Now you can find the minimum of these distances and that `row + 1` will be the vector that is closest to the point

您可以通过以下方式在一行中完成此操作:


原始代码的计时:

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

我的代码的计时:

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

断言结果相同:

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