Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何用eigen和C+实现matlab的pdist+;?_C++_Matlab_Vectorization_Eigen - Fatal编程技术网

C++ 如何用eigen和C+实现matlab的pdist+;?

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

在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行

我认为这个实现有点慢,因为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;
}