使用LAPACK和BLAS 对求解


12

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

矩阵是密集的,具有一般形式,但不大于1000x1000。因此在MATLAB中,可以通过函数或正斜杠表示法找到解决方案Amrdivide(b,A)x = b/A;

如何使用BLAS和LAPACK例程在C ++代码中解决此问题?

我熟悉的LAPACK程序DGESV解决了为。xAx=bx

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

(xA)T=bT

ATxT=bT

xT=(AT)1bT

然后通过DGESV对转置的进行运算来求解最终形式。(因此转置成本和解决系统的成本)ATA

有没有一种方法更有效或以其他方式更好

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

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

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

Answers:


10

对于琐碎答案正方形 :使用一种解决也是时。A T x = bAdgesvxATx=bTRANS = 'T'

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


感谢您的回答和解释!我对LAPACK所做的工作很少,现在我知道要寻找TRANS选项。我在解决TRANS参数方面遇到困难boost::numeric::bindings::lapack::gesvx(),但这不是我的问题的一部分。如果我确实有成功,我将带回有关如何做的注释。
NoahR

我有一个使用的有效解决方案gesvx(),尽管并非一路绊脚。当TRANS参数为'T'时,LAPACK文档说gesvx可以解决,但实际上它可以解决因为输入参数和形式应为非形式。 -转置形式。因此,自变量被换位,而和没有。太好了,这样更方便。如果其他人偶然发现了尝试使用增强型数字绑定的方法,我会说我无法获得此解决方案中使用的转置接口。通过绑定工作。A T X T = B T X B A X BATX=BATXT=BTXBAXB
NoahR

好的,我通过找到了使用gesvx转置格式的技巧boost::numeric::bindings。将转置矩阵包装在函数中。这将参数标识为转置类型: ATtrans()boost::numeric::bindings::lapack::gesvx( FACT, boost::numeric::bindings::trans(Atransposed), af, ipiv, equed, r, c, b, x, rcond, ferr, berr );
NoahR 2013年

0

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

xA=bxQR=bx=bR1QT

这对于任何矩形工作。A


3
如果是矩形(不是正方形),则也是如此,并且表达式是未定义的。R R 1ARR1
Geoff Oxberry
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.