Eigen 中的稀疏矩阵和矢量加法广播
SparseMatrix and Vector addition broadcasting in Eigen
我想将密集 VectorXf
添加到 SparseMatrix
,我知道我可以轻松地为密集矩阵做矩阵 + 向量,like this
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;
但是如何对稀疏矩阵执行此操作?
执行此操作的最简单方法是遍历所有列并将稀疏向量添加到稀疏矩阵。你应该记住,如果你需要 colwise 操作,你的矩阵应该存储为 Column-Major。
// 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;
}
对于密集向量不能以这种方式完成,原因之一是此操作没有任何意义,因为生成的矩阵将是密集的。在这种情况下,您将需要创建一些密集矩阵并像这样对密集向量执行 colwise 操作:
Eigen::MatrixXd(spM).colwise() + v
我想将密集 VectorXf
添加到 SparseMatrix
,我知道我可以轻松地为密集矩阵做矩阵 + 向量,like this
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;
但是如何对稀疏矩阵执行此操作?
执行此操作的最简单方法是遍历所有列并将稀疏向量添加到稀疏矩阵。你应该记住,如果你需要 colwise 操作,你的矩阵应该存储为 Column-Major。
// 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;
}
对于密集向量不能以这种方式完成,原因之一是此操作没有任何意义,因为生成的矩阵将是密集的。在这种情况下,您将需要创建一些密集矩阵并像这样对密集向量执行 colwise 操作:
Eigen::MatrixXd(spM).colwise() + v