|
|
◆ _dlatme()
| void _dlatme |
( |
int |
n, |
|
|
char |
dist, |
|
|
int |
iseed[], |
|
|
double |
d[], |
|
|
int |
mode, |
|
|
double |
cond, |
|
|
double |
dmax, |
|
|
char |
ei[], |
|
|
char |
rsign, |
|
|
char |
upper, |
|
|
char |
sim, |
|
|
double |
ds[], |
|
|
int |
modes, |
|
|
double |
conds, |
|
|
int |
kl, |
|
|
int |
ku, |
|
|
double |
anorm, |
|
|
int |
lda, |
|
|
double |
a[], |
|
|
double |
work[], |
|
|
int * |
info |
|
) |
| |
指定された固有値を持つランダム非対称正方行列の生成
- 目的
- 本ルーチンは指定された固有値を持つランダム非対称正方行列を生成する.
dlatmeは以下の順に処理を行う.
- 対角要素をdとする. ただし, dは入力値, または, 下記のようにmode, cond, dmaxおよびrsignに基づいて求めた値である.
- 複素共役対が必要(mode = 0 かつ ei[0] = 'R', または mode = 5)であれば, dの隣り合う要素の対は複素共役対の実数部および複素数部の対であるとみなす. 従って, Aは1×1および2×2ブロックよりなるブロック対角行列となる.
- upper = 'T'であれば, Aの上三角部分は分布distのランダム値に設定される.
- sim = 'T'であれば, 特異値がds, modes および condsで指定されたランダム行列Xを左からAに乗算する. また, Xの逆行列を右から乗算する.
- kl < n-1であれば, ハウスホルダー変換により下帯幅をklまで減らす. ku < n-1であれば, 上帯幅をkuまで減らす.
- anormが非負であれば, 行列は最大ノルムがanormとなるようにスケーリングされる.
(注: 行列をヘッセンベルグ形以上には縮小することはできないため, 圧縮格納オプションは用意されていない.)
- 引数
-
| [in] | n | Aの列数(あるいは行数). (n >= 0) |
| [in] | dist | ランダム固有値/特異値生成に使用する乱数の分布.
= 'U': 一様分布 (0, 1).
= 'S': 一様分布 (-1, 1).
= 'N': 正規分布 (0, 1). |
| [in,out] | iseed[] | 配列 iseed[liseed] (liseed >= 4)
[in] 乱数発生ルーチンのシード. (0 <= iseed[i] <= 4095, ただし iseed[3]は奇数)
[out] iseed[]の値は変更され, 同じ乱数系列を続けるために次の呼び出しで使うことができる. |
| [in,out] | d[] | 配列 d[ld] (ld >= n)
Aの固有値を指定するために使用される.
[in] mode = 0であれば, d[]は固有値の入力とみなされる(ただし, ei[]の説明を参照せよ).
[out] mode != 0であれば, mode, cond, dmax および rsignに基づいて固有値が計算され, d[]に入れられる. |
| [in] | mode | 固有値の指定方法.
= 0: d[] (および ei[]) にユーザーが入力する.
= 1: d[0] = 1, d[1〜n-1] = 1/cond.
= 2: d[0〜n-2] = 1, d[n-1] = 1/cond.
= 3: d[i] = cond^(-i/(n-1)) (i = 0〜n-1).
= 4: d[i] = 1-i/(n-1)*(1-1/cond) (i = 0〜n-1).
= 5: (1/cond, 1)の範囲で対数値が一様に分布するようにランダムに生成する. 偶数番と奇数番の各要素の対は, 2つの実数固有値として, または, 固有値の複素共役対の実数部と虚数部として使われる. どちらになるかは50-50の確率でランダムに選択される.
< 0: |mode|と同じであるがd[]の中に逆順に入れる. 従って, mode = 1〜4であれば, d[]の値は1〜1/condの範囲に並ぶ. -1〜-4であれば, d[]の値は1/cond〜1の範囲に並ぶ. |
| [in] | cond | 上記のmodeの説明のように使用される. (cond >= 1) |
| [in] | dmax | mode = -6, 0および6以外のとき, modeおよびcondに基づき計算された, d[]の値はdmax/max(abs(d[i]))によりスケーリングされる. dmaxは正の値でなくてもよいことに注意せよ: dmaxが負(または0)であれば, d[]は負の値(または0)によりスケーリングされる. |
| [in] | ei[] | 配列 ei[lei] (lei >= n)
mode = 0の場合にのみ有効で, その他の場合には参照されない.
ei[0] = ' 'の場合:
入力されるd[]はすべて実数固有値である.
ei[0] = 'R'の場合:
入力されるd[]のどの要素が実数固有値で, どれが固有値の複素共役対であるかをei[]が示す.
ei[j-1] = 'R'でei[j] = 'I'であれば, j番目の固有値はd[j-1] + d[j]iで, j+1番目の固有値はその共役複素数(d[j-1] - d[j]i)である.
ei[j-1] = ei[j] = 'R'であれば, j番目の固有値はd[j-1](実数)である.
2つの要素が続けて'I'であってはならない.
ei[0] = 'I'であってはならない. |
| [in] | rsign | mode = -6, 0, 6以外のときに有効.
= 'T': modeおよびcondに基づき計算された, d[]の要素にランダムに符号(+1または-1)を乗算する.
= 'F': 乗算しない. |
| [in] | upper | = 'T': Aの対角要素(および, 固有値が複素数のときには2×2対角ブロック)より上の要素をdistに従ったランダム値に設定する.
= 'F': 設定しない. |
| [in] | sim | = 'T': Aに相似変換を施す, すなわち, 左からX, 右からX^(-1)を乗算する. ただし, X = U*S*Vで, UとVはランダムなユニタリ行列, Sはds[], modesおよびcondsで指定された特異値(対角行列)である.
= 'F': Aに変換を行わない. |
| [in,out] | ds[] | 配列 ds[lds] (lds >= n)
d[]がAの固有値を指定するのと同様に, ds[]はXの特異値を指定するために使用される.
modes = 0 の場合, 非ゼロの特異値がds[]に入力として与えられる. |
| [in] | modes | |
| [in] | conds | modeおよびcondと同様であるが, Sの対角要素を指定する. modes = -6および6は許されない(ランダムに悪条件の固有値を与えてしまうため). |
| [in] | kl | 行列の下帯幅. (kl >= 1)
kl = 1 は上ヘッセンベルグ形を示す. kl >= n-1であれば, Aは最大下帯幅を持つ. |
| [in] | ku | 行列の上帯幅. (ku >= 1)
ku >= n-1であれば, Aは最大上帯幅を持つ. ku >= n-1 かつ kl >= n-1の場合, Aは密行列である. kuとklのどちらか一方のみをn-1より小さくすることができる. |
| [in] | anorm | anorm >= 0 の場合, Aの要素の最大ノルムがanormになるように非負の実数でスケーリングされる. |
| [in] | lda | 二次元配列a[][]の整合寸法. (lda >= n) |
| [out] | a[][] | 配列 a[la][lda] (la >= n)
要求されたテスト行列. |
| [out] | work[] | 配列 work[lwork] (lwork >= 3*n)
作業領域. |
| [out] | info | = 0: 正常終了
= -1: 入力パラメータ n の誤り (n < 0)
= -2: 入力パラメータ dist の誤り (dist != 'U', 'S'および'N')
= -5: 入力パラメータ mode の誤り (mode < -6 または mode > 6)
= -6: 入力パラメータ cond の誤り (cond < 1)
= -8: 入力パラメータ ei の誤り (ei[]が不正な値を含む)
= -9: 入力パラメータ rsign の誤り (rsign != 'T'および'F')
= -10: 入力パラメータ upper の誤り (upper != 'T'および'F')
= -11: 入力パラメータ sim の誤り (sim != 'T'および'F')
= -12: 入力パラメータ ds の誤り (ds[]が不正な値を含む)
= -13: 入力パラメータ modes の誤り (modes < -5 または modes > 5)
= -14: 入力パラメータ conds の誤り (conds < 1)
= -15: 入力パラメータ kl の誤り (kl < 1)
= -16: 入力パラメータ ku の誤り (ku < 1 または kuとklの両方 < n-1)
= -18: 入力パラメータ lda の誤り (lda < n)
= 1: dlatm1でエラー (d[]の計算中)
= 2: dmaxによるスケーリングができなかった(特異値の最大値が0)
= 3: dlatm1でエラー (ds[]の計算中)
= 4: dlargeでエラー
= 5: dlatm1が特異値として0を返した |
- 出典
- LAPACK
|