使用MKL Eigen求解稀疏矩陣方程組

2021-10-04 16:03:20 字數 1011 閱讀 3725

問題:求解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...