C++ 如何用eigen和C+实现matlab的pdist+;?
在Matlab中,C++ 如何用eigen和C+实现matlab的pdist+;?,c++,matlab,vectorization,eigen,C++,Matlab,Vectorization,Eigen,在Matlab中,D=pdist(X,Y)函数计算两组观测值X和Y之间的成对距离。例如,给定X=randu(3,2),Y=randu(3,2),其中每行存储一个观测值(X,Y)。然后pdist返回一个[3 x 3]D矩阵,其中(i,j)项表示x中的第i个观测值和Y中的第j个观测值之间的距离 我想用C++的特征码来模仿这种行为。< /P> 我天真地使用for循环迭代X中的每个观测值,并计算X中的当前观测值和Y中的每个观测值之间的成对距离。结果是[1 X Y.rows]行向量,然后填充到D矩阵的第I
D=pdist(X,Y)
函数计算两组观测值X和Y之间的成对距离。例如,给定X=randu(3,2),Y=randu(3,2)
,其中每行存储一个观测值(X,Y)。然后pdist
返回一个[3 x 3]D矩阵,其中(i,j)项表示x中的第i个观测值和Y中的第j个观测值之间的距离
我想用C++的特征码来模仿这种行为。< /P>
我天真地使用for循环迭代X中的每个观测值,并计算X中的当前观测值和Y中的每个观测值之间的成对距离。结果是[1 X Y.rows]行向量,然后填充到D矩阵的第I行
我认为这个实现有点慢,因为for循环的两个迭代是独立的,矢量化技术可能会有所帮助
有人能告诉我一些信息来加快实施速度吗
我尝试使用Eigen的binaryExpr,但结果出乎意料。根据您的解释,我已经实现了此功能(我假设您希望观察的数量是动态的,这应该适用于任何数量的观察N1、N2):
#包括
#包括
常数int-oDims=2;
类型定义特征::矩阵观测矩阵;
自动pdist(常数观测矩阵和X、常数观测矩阵和Y)
{
返回(X.replicate(1,Y.rows())-Y.reformed(1,Y.rows()*oDims)。replicate(X.rows(),1))
.重塑(X.行()*Y.行(),oDims)
.rowwise().norm()
.重塑(X.行(),Y.行());
}
int main(){
观测矩阵X(3,oDims),Y(4,oDims);
你说的结果出乎意料是什么意思?你是说你没有得到你想要的结果吗?这是pdist2。不管怎样,谢谢!
#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;
}