C++ 特征值中带原始缓冲区的矩阵乘向量运算

C++ 特征值中带原始缓冲区的矩阵乘向量运算,c++,visual-c++,eigen,C++,Visual C++,Eigen,我想替换以下通用矩阵*向量函数 void MV(double *M, double *x, double *y, int n, int m) { for (int i = 0; i<n; i++) { for (int j = 0; j<m; j++) { y[i] += M[i*m + j] * x[j]; } } } void MV(双*M,双*x,双*y,整数n,整数M) { 对于(int i=0;i您忘

我想替换以下通用矩阵*向量函数

void MV(double *M, double *x, double *y, int n, int m)
{
    for (int i = 0; i<n; i++) {
        for (int j = 0; j<m; j++) {
            y[i] += M[i*m + j] * x[j];
        }
    }
}
void MV(双*M,双*x,双*y,整数n,整数M)
{

对于(int i=0;i您忘记了MV2版本中的
+=
。然后,关于性能,最好让Eigen知道您在编译时有向量:

void MV2(const double *M, const double *x, double *y, int n, int m)
{
    typedef Eigen::Matrix<double, -1, -1, Eigen::RowMajor> Rm;
    Eigen::VectorXd::Map(y,n).noalias() += Rm::Map(M,n,m)
                                         * Eigen::VectorXd::Map(x,m);
}

我可能应该单独问这个问题,但是…我的矩阵是对称的,这个操作是内存带宽限制的。Eigen是否有一个优化的矩阵*对称矩阵的向量操作?我想这可能会使我的吞吐量翻倍,因为它只需要读取一半的矩阵。非常感谢!!!我想
M
仍然需要修改作为完整的矩阵(上下三角形)我可以只存储上下三角形并映射到它吗?我会仔细阅读。事实上,我拥有的是一个由许多小矩阵组成的对称稀疏矩阵。我为这种情况优化了我的代码,如(int I=0;I
并且我只运行上三角中的块以及沿对角线的块。我基本上同时将乘法应用于稀疏矩阵的上三角中的块和下三角中的转置块,但我只需要读取上三角中的块。这要快得多。
int main(void)
{
  double M[12];
  double x[4];
  double y[3];
  for(int i=0; i<12; i++) M[i] = i;
  for(int i=0; i<4; i++) x[i] = i;
  int n = 3, m = 4;

  MV(M,x,y,3,4);
  printf("%f %f %f\n", y[0], y[1], y[2]);
  MV2(M,x,y,3,4);
  printf("%f %f %f\n", y[0], y[1], y[2]);
}
void MV2(const double *M, const double *x, double *y, int n, int m)
{
    typedef Eigen::Matrix<double, -1, -1, Eigen::RowMajor> Rm;
    Eigen::VectorXd::Map(y,n).noalias() += Rm::Map(M,n,m)
                                         * Eigen::VectorXd::Map(x,m);
}
VectorXd::Map(y,n).noalias() += Rm::Map(M,n,m).selfadjointView<Lower>()
                              * VectorXd::Map(x,m);