提出这样的问题会让人良心不安……尽管如此,我发现在谷歌上搜索这个问题非常困难。我正在试验
lapack_int LAPACKE_dgesvd(
int matrix_order, char jobu, char jobvt,
lapack_int m, lapack_int n, double* a,
lapack_int lda, double* s, double* u, lapack_int ldu,
double* vt, lapack_int ldvt, double* superb);
Run Code Online (Sandbox Code Playgroud)
这承诺了奇异值分解。已经停下来害怕 Fortran 我在这里找到了一个信息金矿:http : //www.netlib.no/netlib/lapack/double/dgesvd.f
实际上,该链接的目标解释了所有参数,但 LAPACKE 特定的double* 极好(以及 order 参数,但在 FORTRAN 中,所有参数都是 COL_MAJOR)。
接下来,在这里http://software.intel.com/sites/products/documentation/doclib/mkl_sa/11/mkl_lapack_examples/lapacke_dgesvd_row.c.htm我发现了一个似乎暗示“这是某种工作缓存”的程序.
但是,如果这是真的,LAPACKE_dgesvd_work(..)的原因是什么?
此外,我还有第二个问题:在示例中,他们使用min(M,N)-1作为super的大小。为什么?
根据http://www.netlib.no/netlib/lapack/double/dgesvd.fWORK ,关于fortran版本的参数:
WORK(工作空间/输出)DOUBLE PRECISION 数组,维度 (MAX(1,LWORK)) 退出时,如果 INFO = 0,则 WORK(1) 返回最佳 LWORK;如果 INFO > 0,则 WORK(2:MIN(M,N)) 包含对角线位于 S 中的上双对角矩阵 B 的未收敛上对角元素(不一定已排序)。B满足A = U * B * VT,因此它具有与A相同的奇异值,以及U和VT相关的奇异向量。
有可能 super 是这个上双对角矩阵的上对角线,B它与 A 具有相同的奇异值。这也解释了长度min(n,m)-1
从http://www.netlib.org/lapack/下载的 lapack-3.5.0/lapacke/src/lapacke_dgesvd.c 证实了这一点。
源代码还显示高层函数lapacke_dgesvd()调用中层接口lapacke_dgesvd_work()。如果您使用高级接口,则不必关心 的最佳大小WORK。它将被计算并WORK分配在lapacke_dgesvd()
我想知道使用中层接口是否有任何好处......也许当这个函数在相同大小的小矩阵上多次调用时......
再见,
弗朗西斯