2015-04-22 71 views
0

作爲一個較大問題的一部分,我在處理特徵中的稀疏矩陣時遇到了性能瓶頸。Eigen程序中的性能瓶頸

我需要從稀疏矩陣(G)中的每個元素中減去一個浮點數(x),其中包括係數爲零的位置。因此,零個元素應該有一個價值-x

我這樣做,此刻的方式如下:

//calculate G 
x=0.01; 
for(int i=0;i<rows;i++){ 
    for (int j=0; j<cols; j++) { 
     G.coeffRef(i, j) -= x; 
    } 
} 

當G的尺寸較大,這簡單的計算是一個瓶頸。

我還試圖以稀疏矩陣G變換成一個緻密的和中減去P(填充有值x的矩陣):

MatrixXd DenseG=MatrixXd(G); 
x=0.01; 
for(int i=0;i<rows;i++){ 
    for (int j=0; j<cols; j++) { 
     DenseG(i, j) -= x; 
    } 
} 

這種方法是如此之快。然而,我只是想知道是否還有其他解決方法不涉及將G轉換爲密集型,在非常大的矩陣情況下需要大量內存。

回答

3

當你從所有n^2元素中減去時,你的「稀疏」計算實際上是一個密集的計算。一個主要的區別是,不是在大量內存上完成單個操作,而是每次訪問零元素時都必須爲矩陣分配內存。一般而言,稀疏矩陣在稀疏時非常有效,並且對於大多數操作會產生大量的開銷。只需存儲非常少的元素即可平衡開銷,因此只需重複幾次操作即可。

另一種可能的選擇是利用Eigen's lazy evaluation,但這種情況取決於您的確切要求,您在此未列出。

1

爲AVI金斯伯格說,在一個稠密矩陣失去的G-X其中G所有結構這一操作的結果是初始稀疏矩陣和X是填充有x一個抽象的密集矩陣。

我建議你儘量在算法的其餘部分分開這兩個術語,並更新數學運算來利用這種特殊結構。例如,如果下一步是將其乘以密集矢量v,那麼可以有利地利用:

(G-X)*v == (G*v).array()-v.sum()*x