首先,最明显的是,所有参数都按照指针传入。
然后这套函数库有个共同的习惯,即要求调用者来处理空间,包括提供返回值的空间,用来计算的临时空间。
函数命名:
d表示double。ge表示general,说明是普通矩阵,按照列主序存储。
ev表示eigenvector吧(疑问语气),表达的是函数的功能。
用到的类型解释:
char*,是字符串类型,但LAPACK的函数只关注该字符串的第一个字符integer,就是C里面的int,一般用来指定维度
doublereal,就是C里面的double,参数类型和函数前缀统一(这里是d)
各个参数:
char *jobvl, 第一个字符为'N',表示不求左特征向量,为'V'表示要求
char *jobvr, 同上,是对右特征向量的选项
integer *n, 矩阵的列数
doublereal *
a, 存储A矩阵的空间(列主序!!)
integer *lda, A矩阵的行数
doublereal *wr, 返回的特征值,实部
doublereal *wi, 返回的特征值,虚部
doublereal *vl, 左特征向量的存储空间,大小为ldvl*n
integer *ldvl, 左特征向量存储空间的行数
doublereal *vr, 右特征向量的存储空间,大小为ldvr*n
integer *ldvr, 右特征向量存储空间的行数
doublereal *work, 工作空间,一般至少要4*n
integer *lwork, 工作空间的大小
integer *info,返回信息,0表示成功,-i表示第i个参数有问题,+i表示执行错误
具体的看一下代码就明白了,
实在觉得恼火的,照搬着用也行。。
示例代码:
#include < stdio.h>
#pragma comment(lib , "blas.lib")
#pragma comment(lib , "clapack.lib")
void *malloc(size_t n) ;
#include "f2c.h"
#include "clapack.h"
int main(void)
{
/* 3x3 matrix A
* 76 25 11
* 27 89 51
* 18 60 32
*/
doublereal A[9] = {76, 27, 18, 25, 89, 60, 11, 51, 32};
integer info ;
int i , j ;
char jobvl = 'V' ;
char jobvr = 'V' ;
integer n = 3 ;
doublereal *a = A ;
integer lda = 3 ;
doublereal* wr = (doublereal*)malloc( sizeof(doublereal) * n) ;
doublereal* wi = (doublereal*)malloc( sizeof(doublereal) * n) ;
integer ldvr = 3 ;
doublereal* vr = (doublereal*)malloc( sizeof(doublereal) * n * ldvr) ;
integer ldvl = 3 ;
doublereal* vl = (doublereal*)malloc( sizeof(doublereal) * n * ldvl) ;
integer lwork = n * 4 ;
doublereal *work = (doublereal*)malloc( sizeof(doublereal) * lwork) ;
dgeev_(&jobvl, &jobvr, &n, a, &lda, wr, wi, vl , &ldvl , vr, &ldvr, work, &lwork, &info) ;
printf("info:%d\n" , info) ;
printf("D = \n") ;
for ( i = 0 ; i < n ; i ++ ){
for ( j = 0 ; j < n ; j ++ ){
if ( i == j ) printf("%10.5f" , wr[i]) ;
else printf("%10.5f" , 0.0) ;
}
printf("\n") ;
}
printf("Vl = \n") ;
for ( i = 0 ; i < n ; i ++ ){
for ( j = 0 ; j < n ; j ++ ){
printf("%10.5f" , vl[n * j + i]) ;
}
printf("\n") ;
}
printf("Vr = \n") ;
for ( i = 0 ; i < n ; i ++ ){
for ( j = 0 ; j < n ; j ++ ){
printf("%10.5f" , vr[n * j + i]) ;
}
printf("\n") ;
}
return info;
}