使用示例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