我最近在C++中安装了一个新的用于矩阵计算的库,称为LAPACK。我是该 Realm 的初学者,想通过使用dgeqrf函数测试其在QR分解中的应用。我在下面准备了这个简单的代码:

#include <iostream>
#include <lapacke.h>

using namespace std;

int main()
{
    double a[4] = {0, 2, 2, -1};

    int m=2;
    int n=2;
    int info = 0;
    int lda = m;
    int lwork = n;
    double *work;
    double *tau;

    dgeqrfp_(&m, &n, a, &lda, tau, work, &lwork, &info);
}

我没有错误地构建了它,但是当我尝试运行它时,它没有起作用。我收到以下警告消息:
D:\c++ code\lllll\main.cpp|15|warning: 'tau' is used uninitialized in this function [-Wuninitialized]|
D:\c++ code\lllll\main.cpp|15|warning: 'work' is used uninitialized in this function [-Wuninitialized]|

我不知道出了什么问题,但我认为dgeqrf函数的定义是错误的。

另外,dgeqrfvoid函数。我需要将其结果(Q矩阵)保存到另一个矩阵中,并在计算中使用它。

有人对此有想法吗?

最佳答案

the docs中所述,TAUWORK应该是该函数可以使用的数组。

特别地,WORK应该是double的数组,并且(至少)长度为LWORK,它被用作内部临时存储器。
TAU是一个数组,用于输出QR分解的基本反射器,并且长度应至少为min(n,m)

因此,您的完整通话将如下所示:

#include <iostream>
#include <lapacke.h>
using namespace std;
int main()
{
    double a[4] = {0,2,2,-1};
    int m=2;
    int n=2;
    int info = 0;
    int lda = m;
    int lwork = n;
    double work[2];
    double tau[2];
    dgeqrfp_(&m, &n, a, &lda, tau, work, &lwork, &info);
}

关于c++ - LAPACK在C++中进行QR分解,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41111521/

10-11 16:00