Классифицировать точки по евклидову расстоянию - оптимизировать код - PullRequest
2 голосов
/ 25 марта 2012

У меня есть матрица A, состоящая из 200 векторов размера d.

Я хочу, чтобы матрица B, состоящая из 4096 векторов, была классифицирована в эти точки в соответствии с правилом ближайшего расстояния.

Таким образом, результат должен иметь строки размера B с идентификатором (от 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

Может ли кто-нибудь помочь мне повысить эффективность приведенного выше кода ... или, возможно, предложить мне встроенную функцию?

Спасибо

Ответы [ 2 ]

4 голосов
/ 26 марта 2012

Вы можете сделать это в одной строке с 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
1 голос
/ 25 марта 2012

Попробуйте это

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...