【问题标题】:speeding up Euclidean distance calculation for knn加快knn的欧几里得距离计算
【发布时间】:2018-02-19 00:28:39
【问题描述】:

我正在编写一个 KNN 代码,当我使用 pdist 或 pdist2 时,它是如此缓慢。当我使用传统公式计算欧几里得距离时,它的速度要快得多。这是为什么?有没有办法让它更快?

%temp = [F1(i, j), F2(i, j); Xtrain(sample, 1), Xtrain(sample, 2)];
meshgrid_point = [F1(i, j), F2(i, j)];
sample_point = [Xtrain(sample, 1), Xtrain(sample, 2)];
%euclidean_distance = pdist(temp, 'euclidean');
%%euclidean_distance = pdist2(meshgrid_point, sample_point, 'euclidean');
euclidean_distance = sqrt((meshgrid_point(1) - sample_point(1))^2 + (meshgrid_point(2) - sample_point(2))^2);

【问题讨论】:

  • 在您的示例代码中,您计算​​两点之间的距离。 pdist2 计算两个输入的所有点对之间的距离。因此,如果您输入一个包含 N 个点的矩阵和一个包含 M 个点的矩阵,您将得到 N*M 距离。我不认为使用手写 MATLAB 代码计算速度更快。但是pdist2 如果只给它一对分,可能会有很多开销。

标签: matlab performance


【解决方案1】:

如果您将“pdist”和“pdist2”等效的 mexes(“pdist2mex.mexw64”和“pdistmex.mexw64”)从 matlab 目录(使用搜索找到它们)复制到您的项目目录并使用它们。 (请注意,向量输入约定是 pdist.m 和 pdist2.m 的转置版本)

【讨论】: