LAPACK(4)——矩阵特征值和特征向量的求解

使用示例2)求解矩阵的特征值和特征向量Av= v,函数原型如下,

lapack_int LAPACKE_dgeev( int matrix_order, char jobvl, char jobvr,
lapack_int n,
double* a, lapack_int lda, double* wr,
double* wi, double* vl, lapack_int ldvl, double* vr,
lapack_int ldvr );
/*
params:
matrix_order LAPACK_COL_MAJOR or LAPACK_ROW_MAJOR
jobvl N,表示不求左特征向量, V,表示要求
jobvr 同jobvl,是对右特征向量的选项
n matrix的列数
a matrix
lda a矩阵的行数,lda>=max of(1,n)
wr 返回的特征值的实部
wi 返回的特征值的虚部
vl 左特征向量的存储空间
ldvl 左特征向量的行数
vr 右特征向量的存储空间
ldvr 右特征向量的行数
return:
info = 0, SUCCESS,
-i, 第i个参数错误
+i, 表示执行错误
*/

测试代码如下,

#include <stdio.h>

//lapacke headers
#include "lapacke.h"
#include
"lapacke_config.h"
#include
"lapacke_utils.h"

extern lapack_int LAPACKE_dgeev( int matrix_order, char jobvl, char jobvr,
lapack_int n,
double* a, lapack_int lda, double* wr,
double* wi, double* vl, lapack_int ldvl, double* vr,
lapack_int ldvr );

int main(){
int matrix_order = LAPACK_COL_MAJOR;
char jobvl = 'N';
char jobvr = 'V';
int n = 4;
double A[16] = {
0.35, 0.09, -0.44, 0.25,
0.45, 0.07, -0.33, -0.32,
-0.14, -0.54, -0.03, -0.13,
-0.17, 0.35, 0.17, 0.11
};
int lda = n;
double wr[4] = {0,0,0,0};
double wi[4] = {0,0,0,0};
double vl[16];
int ldvl = 4;
double vr[16];
int ldvr = 4;

int info = LAPACKE_dgeev(matrix_order,jobvl,jobvr,n,A,lda,wr,wi,vl,ldvl,vr,ldvr);
if(info==0){
int i = 0;
int j = 0;
for(i=0;i<n;i++){
printf(
"eigenvalue %d:\n",i);
printf(
"%.6g + i %.6g \t",wr[i],wi[i]);
printf(
"right eigenvector: ");
for(j=0;j<ldvr;j++)
printf(
"%.6g \t",vr[i*4+j]);
printf(
"\n");
}
printf(
"SUCCESS\n");
}

return 0;
}

测试结果如下,

eigenvalue 0:
0.799482 + i 0 right eigenvector: -0.655089 -0.523629 0.536218 -0.0956068
eigenvalue
1:
-0.0994125 + i 0.400792 right eigenvector: -0.193302 0.251857 0.0971825 0.675954
eigenvalue
2:
-0.0994125 + i -0.400792 right eigenvector: 0.254632 -0.522405 -0.308384 0
eigenvalue
3:
-0.100657 + i 0 right eigenvector: 0.125333 0.332022 0.593838 0.722087
SUCCESS

可以参照下面的链接进行检验。 http://www.nag.co.uk/lapack-ex/examples/results/dgeev-ex.r

函数参数说明的地方有一些变化,参数lda,ldvl等,表示的是对应矩阵的行数。

另外,有一个网站给出了lapack的测试数据,我们可以根据这些数据,检验自己使用函数是否正确。 http://www.nag.co.uk/lapack-ex/node136.html#index

有另外的LAPACK的一些笔记,可以参考 http://hi.baidu.com/hplonline/blog/category/c%26%2347%3Bc%2B%2B

原文地址:https://www.cnblogs.com/Frandy/p/LAPACK_Eigen_Problem.html