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

本文介绍如何使用LAPACK库中的dgeev函数来求解矩阵的特征值及特征向量,并提供了完整的测试代码及运行结果。通过具体实例展示了如何调用该函数并解释了各参数的意义。

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


  
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/archive/2011/05/20/LAPACK_Eigen_Problem.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值