?sy(he)gv

计算广义特征值问题的所有特征值和特征向量(可选)。

矩阵A,B为对称(Hermitian)矩阵,同时B为正定矩阵。

接口定义

C Interface:

dsygv_(const int *itype, const char *jobz, const char *uplo, const int *n, double *a, const int *lda, double *b, const int *ldb, double *w, double *work, const int *lwork, int *info);

ssygv_(const int *itype, const char *jobz, const char *uplo, const int *n, float *a, const int *lda, float *b, const int *ldb, float *w, float *work, const int *lwork, int *info);

chegv_(const int *itype, const char *jobz, const char *uplo, const int *n, kml_complex_float *a, const int *lda, kml_complex_float *b, const int *ldb, float *w, kml_complex_float *work, const int *lwork,

float *rwork, int *info);

zhegv_(const int *itype, const char *jobz, const char *uplo, const int *n, kml_complex_double *a, const int *lda, kml_complex_double *b, const int *ldb, double *w, kml_complex_double *work, const int *lwork,

double *rwork, int *info);

Fortran Interface:

DSYGV(ITYPE, JOBZ, UPLO, N, A, LDA, B, LDB, W, WORK, LWORK, INFO);

SSYGV(ITYPE, JOBZ, UPLO, N, A, LDA, B, LDB, W, WORK, LWORK, INFO);

CSYGV(ITYPE, JOBZ, UPLO, N, A, LDA, B, LDB, W, WORK, LWORK, RWORK, INFO);

ZSYGV(ITYPE, JOBZ, UPLO, N, A, LDA, B, LDB, W, WORK, LWORK, RWORK, INFO);

参数

参数

类型

说明

输入/输出

itype

整数型

求解问题类型

  • 1:A*x=lambda*B*x
  • 2:A*B*x = (lambda)*x
  • 3:B*A*x = (lambda)*x

输入

jobz

字符型

  • N:只计算特征值;
  • V:计算特征值和特征向量

输入

uplo

字符型

  • U:矩阵A的上三角部分被存储;
  • L:矩阵A的下三角部分被存储

输入

n

整数型

矩阵A和B的维度

输入

a

  • 在ssygv中为单精度浮点型数组。
  • 在dsygv中为双精度浮点型数组。
  • 在chegv中为单精度复数型数组。
  • 在zhegv中为双精度复数型数组。

矩阵A

输入/输出

lda

整数型

矩阵A的主维

输入

b

  • 在ssygv中为单精度浮点型数组。
  • 在dsygv中为双精度浮点型数组。
  • 在chegv中为单精度复数型数组。
  • 在zhegv中为双精度复数型数组。

矩阵B

输入/输出

ldb

整数型

矩阵B的主维

输入

w

单/双精度

长度为n的数组,存储得到特征值(升序排列)

输出

work

单/双精度

若info=0,work(0)返回最佳lwork

输出

lwork

整数型

work数组的长度。

lwork ≥ max(1, 2*n-1)。

输入

rwork(复数类型特有)

  • 在chegv中为单精度复数型数组。
  • 在zhegv中为双精度复数型数组。

工作数组,用于临时存储数据。

输出

info

整数型

状态值:

等于0:表示成功。

小于0:第-info个参数值不合法。

大于0:算法出错。

输出

依赖

#include "klapack.h"

示例

C Interface:
    int itype = 1;
    char jobz = 'V';
    char uplo = 'L';
    int n = 5;
    double a[] = {7.027, 8.710, 1.015, 6.929, 7.584,
                    8.710, 0.839, 2.469, 3.850, 0.559,
                    1.015, 2.469, 1.930, 6.761, 7.207,
                    6.929, 3.850, 6.761, 4.344, 4.804,
                    7.584, 0.559, 7.207, 4.804, 6.177};
    int lda = 5;
    double b[] = {2.345678,1.234567,0.987654,1.456789,0.876543,
                1.234567,2.345678,1.123456,0.987654,1.234567,
                0.987654,1.123456,2.345678,1.234567,0.987654,
                1.456789,0.987654,1.234567,2.345678,1.123456,
                0.876543,1.234567,0.987654,1.123456,2.345678};
    int ldb = 5;
    double w[5];
    double work[15];
    int lwork = 15;
    int info = 0;

    dsygv_(&itype, &jobz, &uplo, &n, a, &lda, b, &ldb, w, work, &lwork, &info);

    /* 
     * Output: 
     * Eigenvalues (in w) 
     *  -8.726204 -2.319727 1.043130 4.411714 4.668052 
     * Eigenvectors (in a) 
     *   0.604055 -0.456650 0.512079 -0.505769 -0.177986
     *   0.174314 -0.523003 -0.357093 0.517106 -0.028092 
     *   -0.277558 0.232180 0.310527 0.581010 -0.538289 
     *   0.541974 0.126215 -0.182883 -0.010722 0.210494 
     *   -0.205335 -0.456850 0.389506 0.070554 0.553286
     */

Fortran Interface:

INTEGER :: itype = 1
CHARACTER :: jobz = "V"
CHARACTER :: uplo = "L"
PARAMETER (n = 5)
PARAMETER (lda = 5)
PARAMETER (ldb = 5)
PARAMETER (lwork = 15)
REAL(8) :: a(lda, n)
REAL(8) :: w(n)
REAL(8) :: work(lwork)
INTEGER :: info = 0

DATA a / 7.027, 8.710, 1.015, 6.929, 7.584,
         8.710, 0.839, 2.469, 3.850, 0.559,
         1.015, 2.469, 1.930, 6.761, 7.207,
         6.929, 3.850, 6.761, 4.344, 4.804,
         7.584, 0.559, 7.207, 4.804, 6.177 /
DATA b / 2.345678,1.234567,0.987654,1.456789,0.876543,
         1.234567,2.345678,1.123456,0.987654,1.234567,
         0.987654,1.123456,2.345678,1.234567,0.987654,
         1.456789,0.987654,1.234567,2.345678,1.123456,
         0.876543,1.234567,0.987654,1.123456,2.345678 /

EXTERNAL DSYGV
CALL DSYGV(itype, jobz, uplo, n, a, lda, b, ldb, w, work, lwork, info)