2017-08-26 152 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