Eigen SparseMatrix 元素放入方式比較

 在第一種直接對行列放入

SparseMatrix mat(rows,cols); // default is column major
mat.reserve(VectorXi::Constant(cols,6));
for each i,j such that v_ij != 0
   mat.insert(i,j) = v_ij;   // alternative: mat.coeffRef(i,j) += v_ij;
mat.makeCompressed();       // optional


 第二種 放入vector中在一起放入

typedef Eigen::Triplet T;
std::vector tripletList;
tripletList.reserve(estimation_of_entries);
for(...)
{
  // ...
  tripletList.push_back(T(i,j,v_ij));
}
SparseMatrixType mat(rows,cols);
mat.setFromTriplets(tripletList.begin(), tripletList.end());
// mat is ready to go!


經實際使用在跑大約10萬個SparseMatrix時,第一種大約要5-10分鐘,第二種的話1分鐘內

兩者都是使用CPU運行,但比較後,若不是要一個個修的話,建議使用第二種方式。

留言

這個網誌中的熱門文章

🔍Vue.js 專案錯誤排查:解決 numericFields is not defined 與合併儲存格邏輯最佳化

🛠【ASP.NET Core + Oracle】解決 ORA-00904 "FALSE": 無效的 ID 錯誤與資料欄位動態插入顯示問題

🔎EF Core 連 Oracle 出現 ORA-00600 [kpp_concatq:2] 的完整排錯指南(含 EF Core ToString/CultureInfo 錯誤)