CLAPACK的dgeev_求特征值

int dgeev_(char *jobvl, char *jobvr, integer *n, doublereal * a, integer *lda, doublereal *wr,doublereal *wi, doublereal *vl,
    integer *ldvl, doublereal *vr, integer *ldvr, doublereal *work,integer *lwork, integer *info);

首先,最明显的是,所有参数都按照指针传入。
然后这套函数库有个共同的习惯,即要求调用者来处理空间,包括提供返回值的空间,用来计算的临时空间。

函数命名:

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;
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值