我利用Eigen3.4和mkl解决par线系统。
此前,我得以利用Eigen:SimplicialLDLT解决国际电子教育问题,但需要很长时间。 表二是J^T * J和EE是一种密集的病媒计算出来的一种稀释矩阵。 J是泛神的矩阵,其尺寸为175215 * 175215,EE是介质175215 * 1。 而J是无可争辩的,它只为神父和神父附近的分子具有价值。
就我的案件而言,Eigen:SimplicialLDLT使用14套,而MATLAB只使用2.5套。 因此,我试图利用Eigen:Pardiso来解决这一问题。 使用这种方法确实很快,但产生一种非常接近零的不正确解决办法。 这种方法似乎有许多参数可以确定,它是否帮助我找到正确的解决办法? 还是有另一个更有效的办法解决这一问题?
我几乎使用了Eigen提供的所有方法,包括自己的偿付者和一些外部偿付者,例如 SuiteSparse,但结果不是好的,要么非常缓慢,要么不正确。 我想找到一个正确的解决办法,时间消耗类似于MATLAB。
我的法典如下:
Eigen::SparseMatrix<double> U = JPSlice.transpose() * JPSlice ;
Eigen::SparseMatrix<double> V = JDRow.transpose() * JDRow + WeightHH;
Eigen::SparseMatrix<double> W = JPSlice.transpose() * JDRow;
Eigen::VectorXd VecErrorS = Eigen::VectorXd::Map(ErrorS.data(), ErrorS.size());
Eigen::VectorXd EP = -JPSlice.transpose() * VecErrorS;
Eigen::VectorXd ED = -JDRow.transpose() * VecErrorS;
Eigen::ArrayXi RowIdSelectVar = IdSelectVar.col(0);
Eigen::ArrayXi ColIdSelectVar = IdSelectVar.col(1);
// Sort the order to variables order
Eigen::ArrayXi ArraySortSelectId = RowIdSelectVar * ValParam.Sizej + ColIdSelectVar;
std::sort(ArraySortSelectId.data(), ArraySortSelectId.data() + ArraySortSelectId.size());
Eigen::ArrayXd SortSelectMap = SelectMap.transpose().reshaped(ValParam.Sizei*ValParam.Sizej,1);
Eigen::VectorXd XH0 = SortSelectMap(ArraySortSelectId);
Eigen::VectorXd EH = -WeightHH * XH0;
Eigen::VectorXd EDEH = ED + EH;
Eigen::SparseMatrix<double> UW = igl::cat(2, U, W);
Eigen::SparseMatrix<double> WT = W.transpose();
Eigen::SparseMatrix<double> WV = igl::cat(2, WT, V);
Eigen::SparseMatrix<double> II = igl::cat(1, UW, WV);
Eigen::VectorXd EE = igl::cat(1,EP,EDEH);
II.makeCompressed();
Eigen::initParallel();
Eigen::ConjugateGradient<Eigen::SparseMatrix<double>> solver;// or other method
solver.compute(II);
Eigen::VectorXd Delta = solver.solve(EE);