如何用C++实现matlab的pdist



在Matlab中,D = pdist(X, Y)函数计算两组观测值X和Y之间的成对距离。例如,给定X = randu(3, 2), Y = randu(3, 2),其中每行存储一个观测值(X,Y(。然后pdist返回[3x3]D矩阵,其中(i,j(条目表示x中的第i个观测值和Y中的第j个观测值之间的距离。

我想用C++使用Eigen来模仿这种行为。

我天真地使用for循环来迭代X中的每个观测值,并计算X中当前观测值和Y中每个观测值之间的成对距离。结果是[1 X Y.rows]行向量,然后将其填充到D矩阵的第I行中。

我认为这个实现有点慢,因为for循环的两次迭代是独立的,矢量化技术可能会有所帮助。

有人能告诉我一些信息,让实现更快吗?

我尝试使用Eigen的binaryExpr,但结果不是预期的。

我已经根据您的解释实现了这个功能(我假设您希望观测的数量是动态的,这应该适用于任何数量的观测N1、N2(:

#include <Eigen/Dense>
#include <iostream>
const int oDims = 2;
typedef Eigen::Matrix<double, Eigen::Dynamic, oDims, Eigen::RowMajor> ObservationMatrix;
auto pdist(const ObservationMatrix& X, const ObservationMatrix& Y)
{
return (X.replicate(1, Y.rows()) - Y.reshaped<Eigen::RowMajor>(1, Y.rows() * oDims).replicate(X.rows(), 1))
.reshaped<Eigen::RowMajor>(X.rows() * Y.rows(), oDims)
.rowwise().norm()
.reshaped<Eigen::RowMajor>(X.rows(), Y.rows());
}
int main() {
ObservationMatrix X(3, oDims), Y(4, oDims);
X << 3, 2,
4, 1,
0, 5;
Y << 10, 14,
12, 17,
16, 11,
13, 18;
Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor> result = pdist(X, Y);
std::cout << result << std::endl;
return 0;
}

我不确定这个实现是否更快,但如果您可以使用for循环共享您的实现,我们可以检查时间。我试着用MATLAB的pdist函数来验证它的功能。然而,我找不到像您所描述的那样接受两个矩阵X,Y的pdist模板(https://www.mathworks.com/help/stats/pdist.html)。我是不是错过了什么?

相关内容

  • 没有找到相关文章