具有行主矩阵特征 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++ 的平方欧几里得距离的主要内容,如果未能解决你的问题,请参考以下文章