解决x A = bxA=b为了Xx使用 LAPACK 和 BLAS

计算科学 线性求解器 C++ 拉帕克
2021-11-27 01:46:59

我正在将现有代码从 MATLAB 移植到 C++,并有一个线性系统要解决xA=b(而不是更典型的形式Ax=b)

矩阵A是稠密的,具有一般形式,但不大于 1000x1000。所以在 MATLAB 中,解决方案是通过mrdivide(b,A)函数或正斜杠符号找到的x = b/A;

我应该如何使用 BLAS 和 LAPACK 例程在我的 C++ 代码中解决这个问题?

我熟悉DGESV解决问题的 LAPACK 例程Ax=b为了x.

所以,我的一个想法是使用矩阵转置身份进行一些操作:

(xA)T=bT

ATxT=bT

xT=(AT)1bT

DGESV然后使用转置操作求解最终形式AT. (所以转置成本A和解决系统的成本)

有没有更有效或更好的方法?

我正在使用矩阵和向量类以及来自 BOOST uBLAS 库的 BLAS 实现以及与 LAPACK 库例程的绑定。我已经成功地将此设置用于其他操作,并希望找到仅限于这些库的解决方案。

另外,我应该注意我只在代码设置期间执行了几次此类操作,因此性能不是一个关键问题。

也许这个 MATLAB文档对其mrdivide他人有帮助。

2个回答

正方形的简单答案 A: 使用dgesvx也可以解决ATx=bTRANS = 'T'.

请注意,使用 BLAS 或 LAPACK,您几乎不必转置(交换内存中的元素)矩阵:大多数子例程都有一个TRANS参数来适应对转置矩阵或以不同内存布局存储的矩阵的操作。(转置相当于将 Fortran 连续内存布局更改为 C 连续内存布局,反之亦然。)

您可以计算的伪逆A,通过使用 SVD 的 QR 分解,它们都包含在 LAPACK 中。

xA=bxQR=bx=bR1QT

这适用于任何矩形A.