中文
注册
我要评分
文档获取效率
文档正确性
内容完整性
文档易理解
在线提单
论坛求助
鲲鹏小智

?stedc

对称三对角矩阵的特征值求解,使用Divide-and-Conquer算法。

接口定义

C Interface:

sstedc_(const char *compz, const int *n, float *d, float *e, float *z, const int *ldz, float *work, const int lwork, float *rwork, const int *lrwork,

int *iwork, const int *liwork, int *info);

dstedc_(const char *compz, const int *n, double *d, double *e, double *z, const int *ldz, double *work, const int lwork, double *rwork, const int *lrwork,

int *iwork, const int *liwork, int *info);

cstedc_(const char *compz, const int *n, float *d, float *e, float _Complex *z, const int *ldz, float _Complex *work, const int lwork, float *rwork, const int *lrwork,

int *iwork, const int *liwork, int *info);

zstedc_(const char *compz, const int *n, double *d, double *e, double _Complex *z, const int *ldz, double _Complex *work, const int lwork, double *rwork, const int *lrwork,

int *iwork, const int *liwork, int *info);

Fortran Interface:

SSTEDC(COMPZ, N, D, E, Z, LDZ, WORK, LWORK, RWORK, LRWORK, IWORK, LIWORK, INFO);

DSTEDC(COMPZ, N, D, E, Z, LDZ, WORK, LWORK, RWORK, LRWORK, IWORK, LIWORK, INFO);

CSTEDC(COMPZ, N, D, E, Z, LDZ, WORK, LWORK, RWORK, LRWORK, IWORK, LIWORK, INFO);

ZSTEDC(COMPZ, N, D, E, Z, LDZ, WORK, LWORK, RWORK, LRWORK, IWORK, LIWORK, INFO);

参数

参数

类型

说明

输入/输出

compz

字符型

  • 'N':只计算特征值。
  • 'V':计算特征值和原Hermitian矩阵的特征向量。
  • 'I': 计算特征值和三对角矩阵的特征向量。

输入

n

整数型

矩阵的维度,n≥0

输入

d

  • 在sstedc中为单精度浮点型数组
  • 在dstedc中为双精度浮点型数组
  • 在cstedc中为单精度浮点型数组
  • 在zstedc中为双精度浮点型数组

长度为n

  • 进入时:三对角矩阵的对角元素。
  • 退出时:若info=0,保存特征值,并以升序排列。

输入,输出

e

  • 在sstedc中为单精度浮点型数组
  • 在dstedc中为双精度浮点型数组
  • 在cstedc中为单精度浮点型数组
  • 在zstedc中为双精度浮点型数组

长度为n-1

  • 进入时:三对角矩阵的次对角元素。
  • 退出时:被销毁。

输入,输出

z

  • 在sstedc中为单精度浮点型数组
  • 在dstedc中为双精度浮点型数组
  • 在cstedc中为单精度复数型数组
  • 在zstedc中为双精度复数型数组

大小为ldz*n

  • 进入时:若compz='V'时,则为正交矩阵。
  • 退出时:
    • 若info=0,且compz='V'时,则为原对称矩阵的正交特征向量。
    • 若compz='I'时,则为对称三对角矩阵的正交特征向量。
    • 若compz='N'时,不使用。

输入,输出

ldz

整数型

矩阵z的主维,ldz >=1; 若需要求特征向量,则ldz ≥ max(1, n)。

输入

work

  • 在sstedc中为单精度浮点型数组
  • 在dstedc中为双精度浮点型数组
  • 在cstedc中为单精度复数型数组
  • 在zstedc中为双精度复数型数组
  • 工作数组,大小为max(1, lwork)。
  • 退出时,若info=0, work(1)返回最优lwork大小。

输出

lwork

整数型

work数组的大小

  • 若compz='N' 或 'I',或n<=1:lwork>=1。
  • 若compz='V'且n>1: lwork >= n*n。
  • 若lwork=-1,表明函数将只查询最优的lwork大小。

输入

rwork

  • 在sstedc中为单精度浮点型数组
  • 在dstedc中为双精度浮点型数组
  • 在cstedc中为单精度浮点型数组
  • 在zstedc中为双精度浮点型数组
  • 工作数组,大小为max(1, lrwork).
  • 退出时,若info=0, rwork(1)返回最优lrwork大小

输出

lrwork

整数型

rwork数组的大小

  • 若compz='N' 或 n<=1:lrwork>=1。
  • 若compz='V' 且 n>1: lrwork >= 1+3*n+2*n*lgn+4*n**2,这里的lgn满足2**k>=n的最小值。
  • 若compz='I'且 n>1: lrwork>=1+4*n+2*n**2。
  • 若lrwork=-1,表明函数将只查询最优的lrwork大小。

输入

iwork

整数型

  • 工作数组,大小为max(1, liwork)。
  • 退出时,若info=0, iwork(1)返回最优liwork大小。

输出

liwork

整数型

iwork数组的大小

  • 若compz='N' 或 n<=1:liwork>=1。
  • 若compz='V' 或 n>1: liwork >= 6+6*n+5*n*lgn。
  • 若compz='I' 或 n>1: liwork>=3+5*n。
  • 若liwork=-1,表明函数将只查询最优的liwork大小。

输入

info

整数型

  • 等于0:表示成功
  • 小于0:info=-i,表示第i个参数非法
  • 大于0:算法在处理位于INFO/(N+1)到mod(INFO,N+1)行、列中的子矩阵时无法计算特征值

输出

依赖

#include "klapack.h"

示例

C Interface:

const char compz = 'N';
const int n = 4;
const int ldz = 4;
double d[] = {72.1673, 66.1857, 64.7644, 28.0199, 91.4151};
double e[] = {6.8955, 7.2465, 3.5019, 8.2268, 3.5287};
double z[] = {0.924528, 0.056604, 0.415094, 0.924528,
             0.622642, 0.905660, 0.150943, 0.471698,
             0.132075, 0.566038, 0.811321, 0.924528,
             0.339623, 0.283019, 0.679245, 0.283019};
int lwork = 1;
int liwork = 1;
double *work = (double*)malloc(lwork * sizeof(double));
double *iwork = (double*)malloc(liwork * sizeof(double));

int info = 0;

dstedc_(&compz, &n, d, e, z, &ldz, work, &lwork, iwork, &liwork, &info);
if (info != 0) {
    printf("ERROR, info = %d\n", info);
}
/* output */
* d
* 27.676252       56.816901       68.501999       78.142148
* e
* 0.000000        0.000000        0.000000
* z
* 0.924528        0.056604        0.415094        0.924528        0.622642        0.905660        0.150943        0.471698        0.132075        0.566038        * 0.811321        0.924528        0.339623        0.283019        0.679245        0.283019

Fortran Interface:

CHARACTER :: compz = "N"
PARAMETER (n = 4) 
PARAMETER (ldz = 4)
PARAMETER (lwork = 1)
PARAMETER (liwork = -1)
INTEGER :: info = 0 
REAL(8) :: d(n) 
REAL(8) :: e(n-1)
REAL(8) :: z(ldz, n)
REAL(8) :: work(lwork)
REAL(8) :: iwork(liwork)
  
DATA d / 72.1673, 66.1857, 64.7644, 28.0199 / 
DATA e / 6.8955, 7.2465, 3.5019 /
DATA z / 0.924528, 0.056604, 0.415094, 0.924528,
         0.622642, 0.905660, 0.150943, 0.471698,
         0.132075, 0.566038, 0.811321, 0.924528,
         0.339623, 0.283019, 0.679245, 0.283019/
EXTERNAL DSTEDC
 CALL DSTEDC(compz, n, d, e, z, ldz, work, liwork, iwork, liwork, info);
* 
* Output: 
* d:  
* 27.676252       56.816901       68.501999       78.142148
* e:
* 0.000000        0.000000        0.000000
* z:
* 0.924528        0.056604        0.415094        0.924528        0.622642        0.905660        0.150943        0.471698        0.132075        0.566038        * 0.811321        0.924528        0.339623        0.283019        0.679245        0.283019