具有行主矩阵特征 C++ 的平方欧几里得距离

Posted

技术标签:

【中文标题】具有行主矩阵特征 C++ 的平方欧几里得距离【英文标题】:Squared Euclidean distance with Row Major Matrix Eigen C++ 【发布时间】:2021-10-17 17:38:57 【问题描述】:

由于我计划使用 pybind11 将 numpy 数组传递到我的 C++ 代码中,自然我想使用 Row Major 矩阵进行计算。我发现了堆栈上平方欧几里德距离的(一个线性)实现

typedef Eigen::MatrixXd Matrix;
void squared_dist(const Matrix& X1, const Matrix& X2, Matrix& D) 
    D = ((-2 * X1.transpose() * X2).colwise() + X1.colwise().squaredNorm().transpose()).rowwise() + X2.colwise().squaredNorm();

但这要求 X1、X2 和 D 是默认的列主矩阵。我将如何为行主要矩阵实现类似的单行?

【问题讨论】:

【参考方案1】:

您可以使用该单行函数的模板版本,以便它可以接受 RowMajor 以及 ColMajor Eigen::Matrix 参数:

template<class T>
void squared_dist(const T& X1, const T& X2, T& D) 
    D = ((-2 * X1.transpose() * X2).colwise() + X1.colwise().squaredNorm().transpose()).rowwise() + X2.colwise().squaredNorm();

This godbolt demo 展示了如何在代码中使用该函数。

【讨论】:

我的问题更多与使用.colwise().rowwise() 来正确计算RowMajorMatrix 等操作有关。我相信上面的例子假设输入 X1 和 X2 是 Col Major。参见下面的godbolt.org/z/dP867ro4h,D 应该通过 X2.rows() 矩阵返回一个 X1.rows() 不,没有这样的假设。我的答案中的链接示例显示,模板化函数对具有 RowMajor 存储顺序 (typedef MatrixRM) 的矩阵和使用 ColMajor 顺序 (typedef Matrix) 存储的矩阵给出了相同的结果。唯一的假设是作为参数传递给函数的所有三个矩阵具有相同的存储顺序。成员函数.colwise().rowwise() 的结果不依赖于矩阵的存储顺序。

以上是关于具有行主矩阵特征 C++ 的平方欧几里得距离的主要内容,如果未能解决你的问题,请参考以下文章

两个坐标列表的欧几里得距离矩阵

在大数据的两个矩阵之间的所有列之间应用配对欧几里得距离

从具有行主顺序的数组创建特征矩阵

在 Python 中使用随机点制作欧几里德距离矩阵

评估向量距离度量

为啥增加小数位数不影响欧几里得距离的计算时间?