构造本征中的稀疏三对角矩阵

时间:2018-08-15 02:51:28

标签: c++ sparse-matrix linear-algebra eigen

如何在Eigen中构造稀疏的三对角矩阵?我要构造的矩阵在Python中如下所示:

alpha = 0.5j/dx**2
off_diag = alpha*np.ones(N-1)
A_fixed = sp.sparse.diags([-off_diag,(1/dt+2*alpha)*np.ones(N),-off_diag],[-1,0,1],format='csc')

如何使用Eigen软件包在C ++中做到这一点?看来我需要使用here中记录的“三胞胎”,但是考虑到这应该是一个相当普通的操作,是否有更简单的方法来做到这一点?

另一个问题是我应该使用行专业还是列专业。我想求解矩阵方程Ax=b,其中A是一个三对角矩阵。手工进行矩阵矢量乘法时,通常将矩阵的每一行与列矢量相乘,因此将矩阵存储在行大中似乎更有意义。但是计算机呢?如果我想解决Ax=b,哪一个更好?

谢谢

1 个答案:

答案 0 :(得分:0)

三元组是建立稀疏矩阵的指定方法。

您可以采用更简单的方法,并使用A.coeffRef(row, col) = valA.inser(row,col) = val,即逐元素填充矩阵。 由于您具有三对角线系统,因此您可以事先知道矩阵的非零数目,并可以使用A.reserve(Nnz)保留空间。 仍然有效的愚蠢方式是:

uint N(1000);
CSRMat U(N,N);
U.reserve(N-1);

for(uint j(0); j<N-1; ++j)
    U.insert(j,j+1) = -1;
CSRMat D(N,N);
D.setIdentity();
D *= 2;
CSRMat A = U + CSRMat(U.transpose()) + D;

关于求解器和首选存储顺序,正如我记得的那样,重要性不高。尽管C(++)以行优先格式存储连续数据,但算法是否以最佳方式(行主要存储顺序逐行)访问数据取决于算法。通常,算法的正确性不取决于数据的存储顺序。其性能取决于存储顺序和实际数据访问模式的兼容性。 如果您打算使用Eigen自己的求解器,则坚持使用其默认选择(col-major)。如果您打算与其他库(例如ARPACK)接口,请选择该库希望/需要的存储顺序。