|
DSYEV/ZHEEV (CLAPACK) |
DSYEV/ZHEEV
実対称/エルミートな行列の全固有値とオプションとして固有ベクトルを計算する。
<関数>
int dsyev_(char *jobz, char *uplo, integer *n, doublereal *a, integer *lda,
doublereal *w, doublereal *work, integer *lwork, integer *info);
<引数>
char jobz - (input) 固有値だけしか計算しないか、固有値・固有ベクトルを計算するかのフラグ
='N' 行列[A]の固有値だけを計算。
='V' 行列[A]の固有値・固有ベクトル共に計算する。
char uplo - (input) 配列Aに上三角行列を格納するか、下三角行列を格納するかを指定するフラグ。規定値は以下の通りである。
='U' 行列[A]の上三角部分を格納する。
='L' 行列[A]の下三角部分を格納する。
long int n - (input) 正方行列[A]の次数。(n≧0) ここで、行列Aはn行n列である。
double a - (input/output) 配列形式はa[lda×n]。
(input) 対称行列[A]の上三角行列もしくは下三角マトリクスを格納する。
uplo = 'U'のときは、行列Aの上三角部分を、n行n列配列の上三角部分に格納する。
uplo = 'L'のときは、行列Aの下三角部分を、n行n列配列の下三角部分に格納する。
(output) jobz='V' かつ info = 0 ならば、配列Aには正規直行固有ベクトルが格納される。
jobz='N'の場合でも、配列Aは対角要素を含めて入力時に格納した値は破壊される。
long int lda - (input) 行列Aの第一次元(のメモリ格納数)。lda≧max(1,n) つまり、1〜nの中で一番大きい数よりも、ldaが大きくなければならない。
通常はlda=nで良い。
double w - (output) 次元数nの配列。計算された固有値が昇順で格納される(←info=0のとき)。
double work - (output) 次元数lworkの配列。info = 0のとき、work[0]は最適なlworkが格納される。
long int lwork - (input) 配列workの大きさを表す。
(DSYEVでは)基本的にはlwork≧max(1,3*n-1)で、効率的にするには、lwork≧(nb+2)*nとする。
ここで、nbはilaenv_によって返されるdsytrd_のためのブロックサイズである。
いずれにしろ、計算性能を向上させるにはlworkを大きくとればよい。といってみるテスト。
double rwork - (workspace) <zheevのみ> 次元数max(1,3*n-2)の配列。つまり、1〜3*n-2の中で一番大きい数をとる。
通常はrwork = 3*n-2で良い。
long int info - (output)
info = 0: 正常終了
info < 0: info = -i ならば、i番目の引数の値が間違えていることを示す。
info > 0: このアルゴリズムは収束しなかった。中間体である三重対角形のi個の非対角要素はゼロに収束しなかった。
の固有値、固有ベクトルを求める。
|
#include <stdio.h> #define N 3 double A[N*N]; double w[N]; double work[3*N]; int main(void) { long int i; char jobz = 'V'; char uplo ='U'; long int n=N,lda=N,lwork=3*N,info; A[0]=9.;A[1]=999.;A[2]=999.; /* 999が入っている配列の値は利用されない */ A[3]=1.;A[4]=9.;A[5]=999.; A[6]=1.;A[7]=1.;A[8]=9.; dsyev_(&jobz, &uplo, &n, A, &lda, w, work, &lwork, &info); for(i=0;i<N;++i) printf("%lf : vector=[ %lf %lf %lf ]\n",w[i] ,A[i*N], A[i*N+1], A[i*N+2]); return 0; } |
Copyright (C) 2001 Keisuke ABE. All Rights Reserved.