問題:求解ax=b的解,其中,a為大型稀疏矩陣,長和寬分別為1500^2。
一般思路:
(1)a為對稱正定矩陣,對a使用cholesky分解。
(2)a為對稱不定矩陣,使用ldl『分解,即:
pap'=ldl'
其中,l為單位下三角矩陣,d由階數為1或者2的對角塊構成,p是置換矩陣。
(3)不對稱矩陣:lu分解。
(4)長方形矩陣(長》寬):qr分解或者兩邊同乘以a』,構建對稱矩陣,即:
a'ax=a'b
這裡使用lu分解:
流程:(1)安裝mkl。
(2)新建vs工程,設定mkl並行,新增eigen引用。
(3)標頭檔案定義巨集:#define eigen_use_mkl_all 表示使用mkl加速。
(4)引入標頭檔案:
#include //稀疏矩陣
#include //mkl支援
(5)定義並賦值稀疏矩陣a和b。
#include
system_info sysinfo;
getsysteminfo(&sysinfo);
std::cerr << "cpu的數目是" << sysinfo.dwnumberofprocessors << std::endl; //獲取cpu的數目
eigen::initparallel(); //初始化eigen並行環境
mkl_set_dynamic(sysinfo.dwnumberofprocessors); //使用mkl把所有的cpu給用上
(6)求解:
eigen::pardisolu> solver; //定義mkl求解器
solver.analyzepattern(a);
solver.factorize(a);
eigen::sparsematrixresult = solver.solve(in); //求解結果
本機12核,對於乙個(1500^2)*(1500^2)大小的double型矩陣,處理時間9秒。相比mkl加速前,快了3倍,
Eigen使用稀疏矩陣求解線性方程
eigen稀疏矩陣求解線性方程,內建的有直接求解器,迭代求解器和第三方求解器。見文件 圖二見鏈結 這裡是使用eigen裡的迭代求解器,因為矩陣非方陣,也不是對稱的,選擇leastsquaresconjugategradient。1 包含標頭檔案 include eigen sparse includ...
numpy使用fromstring建立矩陣
使用字串建立矩陣是乙個很實用的功能,之前自己嘗試了很多次的小功能使用這個方法就能夠簡單實現。建立長度為16的字串,是為了方便能夠在各種資料型別之間轉換。s mytestfromstring len s 16 這個功能其實是比較讓我興奮的乙個小功能,因為這個簡單的轉換實現了ascii碼的轉換 np.f...
numpy使用fromstring建立矩陣的例項
使用字串建立矩陣是乙個很實用的功能,之前自己嘗試了很多次的小功能使用這個方法就能夠簡單實現。建立長度為16的字串,是為了方便能夠在各種資料型別之間轉換。s mwww.cppcns.comytestfromstring len s 16這個功能其實是比較讓我興奮的乙個小功能,因為這個簡單的轉換實現了a...