使用示例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, 表示执行错误
*/
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 ;
}
// 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
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