LAPACK 在 C++ 中的 QR 分解
QR decomposition in C++ by LAPACK
我最近安装了一个新的 C++ 矩阵计算库,名为 LAPACK。我是这个领域的初学者,想通过使用 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
函数的定义是错误的。
此外,dgeqrf
是一个 void
函数。我需要将其结果(Q 矩阵)保存到另一个矩阵中并在我的计算中使用它。
有人知道吗?
如 the docs 所述,TAU
和 WORK
应该是函数可以处理的数组。
特别是,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。我是这个领域的初学者,想通过使用 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
函数的定义是错误的。
此外,dgeqrf
是一个 void
函数。我需要将其结果(Q 矩阵)保存到另一个矩阵中并在我的计算中使用它。
有人知道吗?
如 the docs 所述,TAU
和 WORK
应该是函数可以处理的数组。
特别是,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);
}