Ste*_*non 10
该例程dgesdd计算双精度矩阵的SVD.你只需要一个如何使用它的例子吗?你试过阅读文档吗?
使用C LAPACK绑定的示例(请注意,我刚刚写了这个,并且实际上没有对它进行测试.另请注意,clapack参数的确切类型在平台之间有所不同,因此您可能需要更改int为其他内容):
#include <clapack.h>
void SingularValueDecomposition(int m,     // number of rows in matrix
                                int n,     // number of columns in matrix
                                int lda,   // leading dimension of matrix
                                double *a) // pointer to top-left corner
{
    // Setup a buffer to hold the singular values:
    int numberOfSingularValues = m < n ? m : n;
    double *s = malloc(numberOfSingularValues * sizeof s[0]);
    // Setup buffers to hold the matrices U and Vt:
    double *u = malloc(m*m * sizeof u[0]);
    double *vt = malloc(n*n * sizeof vt[0]);
    // Workspace and status variables:
    double workSize;
    double *work = &workSize;
    int lwork = -1;
    int *iwork = malloc(8 * numberOfSingularValues * sizeof iwork[0]);
    int info = 0;
    // Call dgesdd_ with lwork = -1 to query optimal workspace size:
    dgesdd_("A", &m, &n, a, &lda, s, u, &m, vt, &n, work, &lwork, iwork, &info);
    if (info) // handle error conditions here
    // Optimal workspace size is returned in work[0].
    lwork = workSize;
    work = malloc(lwork * sizeof work[0]);
    // Call dgesdd_ to do the actual computation:
    dgesdd_("A", &m, &n, a, &lda, s, u, &m, vt, &n, work, &lwork, iwork, &info);
    if (info) // handle error conditions here
    // Cleanup workspace:
    free(work);
    free(iwork);
    // do something useful with U, S, Vt ...
    // and then clean them up too:
    free(s);
    free(u);
    free(vt);
}