犰狳复杂稀疏矩阵求逆

3
我正在使用Armadillo C++ (4.400.1)编写程序。
我有一个必须是稀疏和复杂的矩阵,并且我想计算这种矩阵的逆矩阵。由于它是稀疏的,可能是伪逆矩阵,但我可以保证该矩阵具有完整对角线。
在Armadillo的API文档中,提到了方法.i()来计算任何矩阵的逆矩阵,但是sp_cx_mat成员不包含这种方法,而inv()pinv()函数显然无法处理sp_cx_mat类型。
sp_cx_mat Y;

/*Fill Y ensuring that the diagonal is full*/

sp_cx_mat Z = Y.i();

或者

sp_cx_mat Z = inv(Y);

它们都无法正常工作。

我想知道如何计算sp_cx_mat类型的矩阵的逆。


尺寸是多少?是 X * X 还是 X * Y? - Surt
矩阵是正方形的,所以 X by X。 - Santi Peñate-Vera
2
稀疏矩阵的逆矩阵未必是稀疏的。你真的需要稀疏矩阵的逆矩阵吗?在快速搜索后,我看到的所有文献都建议用不同的方法解决底层问题。例如,使用迭代方法(或其他方法)解决 Ax = b。 - Unapiedra
你可以计算SVD。假设 U S V == Y,那么 Y.pinv() == U S.pinv() V。因为 Y 是满秩的(因为有非零对角线),所以 Armadillo::svd_econ() 没有意义。因此,与其他求解伪逆的方法相比,计算SVD会慢得多。 - Unapiedra
如果你想解决(A^-1)x=b,为什么不解决x=Ab呢? - dani
显示剩余3条评论
1个回答

5
在Armadillo中,对于稀疏矩阵的支持并不完整,许多针对密集矩阵的分解/复杂操作在稀疏矩阵中并不适用。这其中有很多原因,最主要的是高效的复杂操作,例如针对稀疏矩阵的分解仍然是一个开放的研究领域。因此,cx_sp_mat或其他sp_mat类型没有可用的.i()函数。另一个原因是稀疏矩阵开发人员(包括我)缺乏时间。
鉴于稀疏矩阵的逆通常是密集的,那么您可能更好地将您的cx_sp_mat转换为cx_mat,然后使用与密集矩阵相同的求逆技术。既然您计划将其表示为密集矩阵,那么可以合理地假设您有足够的RAM来执行此操作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接