Eigen C++中的逐列点积

Zed*_*edd 7 c++ linear-algebra eigen

有一个简单的方法来评估的2个矩阵列明智的点积(让我们称之为A和B,类型Eigen::MatrixXd),它们的尺寸mxn,不评估A*B或无需诉诸for循环?得到的矢量需要具有1xn或的尺寸nx1.另外,我正在尝试用C++中的Eigen做到这一点

gga*_*ael 10

有很多方法可以实现这一点,所有方法都执行延迟评估:

res = (A.array() * B.array()).colwise().sum();
res = (A.cwiseProduct(B)).colwise().sum();
Run Code Online (Sandbox Code Playgroud)

而我最喜欢的:

res = (A.transpose() * B).diagonal();
Run Code Online (Sandbox Code Playgroud)


vso*_*tco 1

这是我如何使用Eigen::Map(假设真实矩阵,可以通过伴随矩阵扩展到复数)来做到这一点,其中rows和cols表示行/列数:

#include <Eigen/Dense>
#include <iostream>

int main()
{
    Eigen::MatrixXd A(2, 2);
    Eigen::MatrixXd B(2, 2);
    A << 1, 2, 3, 4;
    B << 5, 6, 7, 8;

    int rows = 2, cols = 2;

    Eigen::VectorXd vA = Eigen::Map<Eigen::VectorXd>(
                             const_cast<double *>(A.data()), rows * cols, 1);
    Eigen::VectorXd vB = Eigen::Map<Eigen::VectorXd>(
                             const_cast<double *>(B.data()), rows * cols, 1);

    double inner_prod = (vA.transpose() * vB).sum();

    std::cout << inner_prod << std::endl;
}
Run Code Online (Sandbox Code Playgroud)