特征中的稀疏矩阵和向量加法广播

SparseMatrix and Vector addition broadcasting in Eigen

本文关键字:向量 广播 特征      更新时间:2023-10-16

我想为SparseMatrix添加一个密集VectorXf,我知道我可以轻松地为密集矩阵做矩阵+向量,像这样

Eigen::MatrixXf mat(2,4);
Eigen::VectorXf v(2);
mat << 1, 2, 6, 9,
3, 1, 7, 2;
v << 0,
1;
//add v to each column of m
mat.colwise() += v;

但是如何为稀疏矩阵执行此操作?

最简单的方法是遍历所有列,并向稀疏矩阵添加一个稀疏向量。你应该记住,如果你需要协同操作,你的矩阵应该存储为列主。

// allocate dense object
Eigen::MatrixXd M(2,4);
Eigen::VectorXd v(2);
// allocate sparse vector
Eigen::SparseVector<double> spV(2);
// allocate Column-major sparse matrix
Eigen::SparseMatrix<double, Eigen::ColMajor> spM(2, 4);
// initialize dense objects values
M << 1, 0, 0, 2,
4, 5, 0, 0;
v << 1,
3;
// convert dense objects to sparse representation
spM = M2.sparseView();
spV = v2.sparseView();
// iterate over sparse Matrix columns
for(int i = 0; i< spM.cols(); ++i) {
spM.col(i) += spV;
}

对于密集向量,不能以这种方式完成,原因之一是此操作没有任何意义,因为生成的矩阵将是密集的。在这种情况下,您需要创建一些密集矩阵并使用密集向量执行协同操作,如下所示:

Eigen::MatrixXd(spM).colwise() + v