|
|
◆ ztrevc3()
| void ztrevc3 |
( |
char |
side, |
|
|
char |
howmny, |
|
|
int |
select[], |
|
|
int |
n, |
|
|
int |
ldt, |
|
|
doublecomplex |
t[], |
|
|
int |
ldvl, |
|
|
doublecomplex |
vl[], |
|
|
int |
ldvr, |
|
|
doublecomplex |
vr[], |
|
|
int |
mm, |
|
|
int * |
m, |
|
|
doublecomplex |
work[], |
|
|
int |
lwork, |
|
|
double |
rwork[], |
|
|
int |
lrwork, |
|
|
int * |
info |
|
) |
| |
シュール分解の三角行列の固有ベクトル (複素行列)
- 目的
- 本ルーチンは上三角複素行列 T の一部または全部の右または左固有ベクトルを求める. このタイプの行列は一般複素行列のシュール分解 A = Q*T*Q^H (zhseqr により計算) により生成される.
T の固有値 w に対応する右固有ベクトル x および左固有ベクトル y は次のように定義される. T*x = w*x, (y^H)*T = w*(y^H)
ここで, y^H はベクトル y の共役転置を表す. 固有値は本ルーチンに入力されないが, T の対角ブロックより直接読み込まれる.
本ルーチンは T の右および左固有ベクトル x および/または y を返す. あるいは, 入力された行列 Q との積 Q*X および/または Q*Y を返す. Q が行列 A をシュール形 T に変換するユニタリ行列であれば Q*X および Q*Y は A の右および左固有ベクトルである.
本ルーチンは逆変換の Level 3 BLAS 版を使用する.
- 引数
-
| [in] | side | = 'R': 右固有ベクトルのみ求める.
= 'L': 左固有ベクトルのみ求める.
= 'B': 右および左固有ベクトルの両方を求める. |
| [in] | howmny | = 'A': すべての右および/または左固有ベクトルを求める.
= 'B': vl および/または vr に入っている行列により逆変換されたすべての右および/または左固有ベクトルを求める.
= 'S': 論理型配列 select により指定された一部の右および/または左固有ベクトルを求める. |
| [in,out] | select[] | 配列 select[lselect][ldselect] (lselect >= n)
howmny = 'S' の場合, select は求める固有ベクトルを指定する. select[j] = true であれば j 番目の固有値に対応する固有ベクトルが求められる.
howmny = 'A' または 'B' の場合, 参照されない. |
| [in] | n | 行列 A の行および列数. (n >= 0) (n = 0 の場合, 処理を行わずに戻る) |
| [in] | ldt | 二次元配列 t[][] の整合寸法. (ldt >= max(1, n)) |
| [in,out] | t[][] | 配列 t[lt][ldt] (lt >= n)
上三角行列 T. t[][]は変更されるが終了時に復元される. |
| [in] | ldvl | 二次元配列 vl[][] の整合寸法. (ldvl >= 1 (side = 'R'), ldvl >= n (side = 'L' または 'B')) |
| [in,out] | vl[][] | 配列 vl[lvl][ldvl] (lvl >= mm)
[in] side = 'L' または 'B' かつ howmny = 'B' の場合, vl[][] に n x n 行列 Q を入れる (通常は zhseqr により返されたシュールベクトルからなるユニタリ行列 Q).
[out] side = 'L' または 'B' の場合, vl[][] に以下を返す.
howmny = 'A' の場合, T の左固有ベクトルからなる行列 Y.
howmny = 'B' の場合, 行列 Q*Y.
howmny = 'S' の場合, select[] により指定された T の左固有ベクトルが, 固有値と同じ順に vl の行に続けて格納される.
side = 'R' の場合, 参照されない. |
| [in] | ldvr | 二次元配列 vr[][] の整合寸法. (ldvr >= 1 (side = 'L'), ldvr >= n (side = 'R' または 'B')) |
| [in,out] | vr[][] | 配列 vr[lvr][ldvr] (lvr >= mm)
[in] side = 'R' または 'B' かつ howmny = 'B' の場合, vr[][] に n x n 行列 Q を入れる (通常は zhseqr により返されたシュールベクトルからなるユニタリ行列 Q).
[out] side = 'R' または 'B' の場合, vr[][] に以下を返す.
howmny = 'A' の場合, T の右固有ベクトルからなる行列 X.
howmny = 'B' の場合, 行列 Q*X.
howmny = 'S' の場合, select[] により指定された T の右固有ベクトルが, 固有値と同じ順に vr の行に続けて格納される.
side = 'L' の場合, 参照されない. |
| [in] | mm | 配列 vl および/または vr の行数. (mm >= m) |
| [out] | m | 配列 vl および/または vr において実際に固有ベクトルを格納するのに使われた行数.
howmny = 'A' または 'B' の場合, m = n と設定される.
選択された固有ベクトルはそれぞれ 1 行を占める. |
| [out] | work[] | 配列 work[lwork]
作業領域.
info = 0 の場合, work[0] に lwork の最適値を返す. |
| [in] | lwork | 配列work[]のサイズ (lwork >= max(1, 2*n))
最適パフォーマンスのためには lwork >= n + 2*n*nb とせよ. ただし, nb は最適ブロックサイズである.
lwork = -1 の場合, 作業領域サイズの問い合わせとみなし, 最適サイズを求める計算だけを行い, work[0] にその値を返す. |
| [out] | rwork[] | 配列 rwork[lrwork]
作業領域.
info = 0 の場合, rwork[0] に lrwork の最適値を返す. |
| [in] | lrwork | 配列 rwork[]のサイズ (lrwork >= max(1, n))
lrwork = -1 の場合, 作業領域サイズの問い合わせとみなし, rwork[] の最適サイズを求める計算だけを行い, rwork[0] にその値を返す. |
| [out] | info | = 0: 正常終了
= -1: 入力パラメータ side の誤り (side != 'R', 'L' および 'B')
= -2: 入力パラメータ howmny の誤り (howmny != 'A', 'B' および 'S')
= -4: 入力パラメータ n の誤り (n < 0)
= -5: 入力パラメータ ldt の誤り (ldt < max(1, n))
= -7: 入力パラメータ ldvl の誤り (ldvl が小さすぎる)
= -9: 入力パラメータ ldvr の誤り (ldvr が小さすぎる)
= -11: 入力パラメータ mm の誤り (mm < m)
= -14: 入力パラメータ lwork の誤り (lwork が小さすぎる)
= -18: 入力パラメータ lrwork の誤り (lrwork が小さすぎる) |
- 詳細
- 本プログラムで使用されているアルゴリズムは基本的には後退(前進)代入である. 起こりうるオーバーフローに対して強くするためにスケーリングを行う.
固有ベクトルはそれぞれ最大要素の大きさが 1 になるように正規化される. ここで, 複素数 (x, y) の大きさは |x| + |y| とする.
- 出典
- LAPACK
|