如何在特征中构造稀疏三对角矩阵?我想构造的矩阵在 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')
如何使用特征包在C++中做到这一点?看起来我需要使用此处记录的"三元组",但是考虑到这应该是一个相当常见的操作,是否有更简单的方法可以做到这一点?
另一个侧面问题是我应该使用行主要还是列主要。我想求解矩阵方程Ax=b
,其中A
是一个三对角矩阵。当我们手动进行矩阵向量乘法时,我们通常将矩阵的每一行乘以列向量,因此将矩阵存储在行主中似乎更有意义。但是计算机呢?如果我想解决Ax=b
,哪一个是首选?
谢谢
三元组是设置稀疏矩阵的指定方法。
你可以走更直接的方式,使用A.coeffRef(row, col) = val
或A.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(++( 以行主格式存储连续数据,但算法是否以最佳方式访问数据(行主存储顺序为逐行(。通常,算法的正确性不取决于数据的存储顺序。其性能取决于存储顺序和实际数据访问模式的兼容性。 如果您打算使用本征自己的求解器,请坚持使用其默认选择(col-major(。如果您打算与其他库(例如 ARPACK(接口,请选择库首选/要求的存储顺序。