2017-08-26 220 views
1

向量加法广播我想密集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; 

但如何做到这一点的稀疏矩阵?

回答

2

最简单的方法是迭代所有列并向稀疏矩阵添加稀疏矢量。你应该记住,如果你需要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 
+0

感谢,并很清楚,其实我在做什么现在的问题是一样的,你说,即迭代所有的列和做'spM.col(i)+ = spV',因为密集矩阵有一个方便的方法'.colwise()'没有迭代列,所以我只是发布这个问题来确认我们是否可以做到这一点稀疏矩阵的'.colwise'事物:-) – avocado

+0

@avocado正如isakoff已经说过的那样,结果无论如何都是密集的,所以你应该把稀疏矩阵转换为一个密集矩阵并从那里继续。 'Eigen :: MatrixXd(spM).colwise()+ v'不给你一个稀疏矩阵,它给你一个密集的临时矩阵(至少它曾经被计算过)。 –

+0

@AviGinsburg,所以'Eigen :: MatrixXd(spM).colwise()+ v'无论如何都会创建一个密集矩阵,对吧?如果是的话,那么我可能不会采取这种方式,因为我处理的稀疏矩阵非常庞大。 – avocado