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


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

  • 相关阅读:
    Spring MVC返回多重的Json数据
    Eclipse Maven项目中修改JDK版本
    Maven的使用笔记
    Windows下Redis主从配置出现Writing to master:Unknow error
    Java开发必会的Linux命令(转)
    使用maven引入slf4j、logback时发生冲突
    使用SSM框架搭建JavaWeb,使用Junit测试时遇到CannotGetJdbcConnetionException
    HTTP基础
    express 热启动 静态文件部署 跨域解决 调试
    github+git提交 基础用法
  • 原文地址:https://www.cnblogs.com/Frandy/p/LAPACK_Eigen_Problem.html
Copyright © 2020-2023  润新知