2016-11-12 113 views
1

我想解決C++中非常大且稀疏的線性方程組系統。目前,我從eigen使用BiCGSTAB。它適用於小矩陣,但它需要的時間太長,我需要的矩陣大小爲40804x40804(未來可能會更大)。C++如何解決非常大的稀疏線性系統系統

我有一個很長的腳本,但我只是用的格式如下:

SparseMatrix<double> sj(40804,40804); 
VectorXd c_(40804), sf(40804); 
sj.reserve(VectorXi::Constant(40804,36)); //This is a very good estimate of how many non zeros in each column 
//...Fill in actual number in sj 
sj.makeCompressed(); 
BiCGSTAB<SparseMatrix<double> > handler; 
//...Fill in sj, only in the entries that have been initialized previously 
handler.analyzePattern(sj) 
handler.factorize(sj); 
c_.setZero(); 
c_=handler.solve(sf); 

這需要的時間太長了!是的,該解決方案確實存在。 matlab中的稀疏函數似乎很好地處理了這個問題,但我需要在C++中才能連接到服務器。

我真的很感激你可以幫助我!

+0

如果MATLAB做的做好你爲什麼不使用它在C++。 [鏈接](https://www.mathworks.com/help/matlab/matlab_external/calling-matlab-software-from-ac-application.html) – Logman

+0

如果連接到服務器是至關重要的,也許你應該嘗試使用pari/gp ... – jaroslawj

+0

確保在編譯器優化ON的情況下進行編譯,然後您可以嘗試直接求解像'Eigen :: SparseLU'(只需用'SparseLU'替換BiCGSTAB')或使用'IncompleteLUT'預處理程序在BICGSTAB。 – ggael

回答

1

你應該考慮使用先進的稀疏直接求解器之一的:CHOLMOD

稀疏直接求解器在計算分析的基本工具,爲獲得高質量的結果,幾乎所有的問題非常普遍的方法。 CHOLMOD是用於稀疏Cholesky factorization的高性能庫。

我保證這個軟件包可以幫助你。此外CHOLMOD已支持GPU加速自2012年以來版本4.0.0。在SuiteSparse-4.3.1中,性能得到了進一步提高,相對於稀疏分解操作,CPU提供了3倍或更高的加速比。

如果你的矩陣是圖的表示,你也可以考慮METISCHOLMOD的組合。這意味着你可以在圖形中進行分區/域分解,然後與CHOLMOD並行求解。

SuiteSparse是一個強大的工具,支持線性(KLU)和直接求解器。

這裏有GitHub linkUserGuideSuiteSparse's home page