Matlab [Q,R,E] = qr(A)后面对应的LAPACK函数是什么?


12

我目前试图廉价地为矩阵计算一个好的秩估计。因此,我使用计算了一个columnt枢轴QR分解A

[Q,R,E]=qr(A)

在Matlab中。我估计军衔使用A

tol = size(A,n)*eps*norm(A,'fro'); 
r = sum(abs(diag(R))>tol)

这可以正常工作,并且在R的所有对角线条目上绘制图如下所示: 情节(sort(abs(diag(R)),1,'descend'),'r *')

R

这两个实验的输入矩阵完全相同。

我的问题现在是Matlab旋转QR分解的列依赖哪个LAPACK函数?

感谢您的帮助,Grisu

编辑: DGEQPF给出相同的错误结果。

编辑2:

  • AE+sign(E,F)
  • A
  • R
  • 我将LAPACK 3.4.0与OpenBlas / GotoBLAS(64位)一起使用
  • Matlab 7,2007b,2010b Linux 32位

Edit3:-使用GDB,我发现Matlab 2010b从/usr/ubuntu10.04/matlabr2010b/bin/glnx86/../../bin/glnx86/../中在dgeqp3_()中调用DGEQP3:#3 0xaa46ce2f。 ./bin/glnx86/mllapack.so为什么使用LAPACK会得到错误的结果(3.4.0包括工作说明176中提到的修复程序)?


您是否可以使用可以在此处共享的较小矩阵来激发相同的行为?
GertVdE 2012年

A

A

Grisu-我很想看看您的矩阵。但是,链接www-e.uni-magdeburg.de/makoehle/A.mtx.gz不再处于活动状态(无论如何当前如此)。您是否有到矩阵的当前链接?谢谢,Les Foster

@LeslieFoster-欢迎来到scicomp!
阿隆·艾玛迪亚

Answers:


7

这里有两个问题:

  • A
  • 您是否具有与MATLAB内部库相同的软件堆栈?

密集还是稀疏?

ADGEQP3[Q,R,E] = qr(A)A

您是否具有与MATLAB内部库相同的软件堆栈?

可能不是,这可能是您获得不同结果的原因之一。

在对正在编写的使用QR因式分解的库进行单元测试时,我遇到了这个问题。我使用MATLAB对我的工作进行原型制作,与使用LAPACK或NumPy获得了不同的结果。据我所知,由于MathWorks并不容易找到此信息,因此MATLAB使用的LAPACK版本不早于版本3.1.1,以及Intel的MKL BLAS库(适用于Windows,Intel Mac和Linux)9.1版或更高(请参阅此处)。我找不到关于SuiteSparse MATLAB使用的版本的任何信息。通过在线浏览或查看系统的库文件,您可以收集其他信息。您可以尝试更改MATLAB链接到的库,以便能够与软件包中的相同库进行比较。Eric Chu提供了不错的文章至少说明了如何用自己的方法替换MATLAB的BLAS库(当然,这样做需要您自担风险)。他建议您也可以使用LAPACK做同样的事情。甚至有可能用您自己的版本替换MATLAB使用的SuiteSparse版本。

A=QRQR

我最终使用NumPy为QR分解的结果制作原型,因为它使用了系统BLAS和LAPACK库。NumPy和SciPy并不是MATLAB的直接替代品,因为这两个库的组合缺少一些MATLAB的功能,但是对于此特定的线性代数任务,Python + NumPy + SciPy + Matplotlib应该能很好地工作。


我认为不可能获得与Matlab相同的软件堆栈。也不想使用其他环境进行原型制作。问题是在Matlab代码工作正常,但不是在C.
MK又名Grisu

@Grisu:我认为要获得相同的软件堆栈非常困难,而没有尝试链接到它们的库中。我感到困惑的是,您如何知道MATLAB中的结果是正确的,而C语言中的结果却是错误的。这是某种具有已知属性的测试矩阵吗?更重要的是,AronAhmadia是正确的。除了复制体系结构和软件堆栈之外,您不能指望通过不稳定的算法获得相同的结果。两年前在MATLAB论坛上,我基本上被告知相同的事情。
Geoff Oxberry 2012年

我认为QR并不稳定。我不能直接检查哪种QR分解是正确的,但是根据等级和Q矩阵,我可以计算出一台投影仪,在那里我可以轻松地验证获得好坏的结果以及来自Matlab的好结果。但是我尝试链接到Matlab库。
MK aka Grisu 2012年

@Grisu:好的结果和正确的结果有明显的区别。我最近错误地实施了计算,这使我的结果看起来很棒。但是,计算是错误的,正确的计算使我的结果看起来不那么令人印象深刻(但值得庆幸的是,这说明我的结果是正确的)。您是否要计算正交投影仪或倾斜投影仪?(我问是因为论文的大部分内容是放在倾斜的投影仪上。)
Geoff Oxberry 2012年

1
@GeoffOxberry:首先,在我的MATLAB版本上,我可以调用internal.matlab.language.versionPlugins.blasinternal.matlab.language.versionPlugins.lapack获取BLAS和LAPACK版本
Amro 2013年

6

请参阅Leslie Foster 关于排名揭露软件页面。另请参阅此LAPACK工作说明,分析排名显示QR的失败xGEQP3

通过在调试器中设置断点并检查堆栈,您应该能够找出MATLAB使用的例程。最后,我承认,几年前,我最后看了MATLAB使用共享库,在这种情况下不能删除符号名称,因此您将在调用堆栈上看到函数名称(但看不到参数,因为它肯定没有保留调试信息)。


排名披露软件页面无济于事。RRQR过程描述的是我在想法中使用的第一件事,但它给出的结果比列透视图想法还要糟糕。
MK又名Grisu 2012年

2
@Grisu-它应该对您有所帮助。该xGEQP3算法对于显示等级并不完全安全。如果要保证得到正确的结果,则应使用SVD或更安全的QR(例如xGEQPX或)xGEQPY。您不能期望不稳定的算法会在不同的体系结构或不同的实现中返回相同的结果(MATLAB可能正在使用较旧的LAPACK)。
Aron Ahmadia 2012年

我知道GEQP3不能显示等级,但是它比RRQR子例程提供的结果更正确。在我的外部算法中,使用SVD太昂贵了。我还将与LAWN-176的作者之一交谈,他认为该错误未涵盖该错误。我还尝试了来自LAPACK 3.0.0的DGEQPF / DGEQP3,结果相同。
MK aka Grisu 2012年
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.