|
|
◆ Zlatmt()
| Sub Zlatmt |
( |
M As |
Long, |
|
|
N As |
Long, |
|
|
Dist As |
String, |
|
|
Iseed() As |
Long, |
|
|
Sym As |
String, |
|
|
D() As |
Double, |
|
|
Mode As |
Long, |
|
|
Cond As |
Double, |
|
|
Dmax As |
Double, |
|
|
Rank As |
Long, |
|
|
Kl As |
Long, |
|
|
Ku As |
Long, |
|
|
Pack As |
String, |
|
|
A() As |
Complex, |
|
|
Info As |
Long |
|
) |
| |
指定された特異値を持つランダム行列/指定された固有値を持つエルミートランダム行列の生成 (ランク数指定可) (複素行列)
- 目的
- 本ルーチンは指定された特異値を持つランダム行列(または指定された固有値を持つエルミートランダム行列)を生成する.
Zlatmtは, 以下の順に処理を行う.
対角要素をDとする. ただし, Dは入力値, または, 下記のようにMode, Cond, DmaxおよびSymに基づいて求めた値である.
次の2つの方法のどちらかにより, 適切な帯構造で行列を生成する.
- 方法A:
左からDを, また, 右からランダムユニタリ行列を乗算しM×N密行列を生成する. 次に, KlおよびKuに従ってハウスホルダー変換により帯幅を減らす.
- 方法B:
帯幅-0(すなわち, 対角)行列をギブンス回転により帯幅-1行列に変換する. 続いて, 帯幅-1行列を帯幅-2行列に変換する. 以下同様. (MおよびNに比べて)適度に小さな帯幅の場合, この方法は密行列を生成しないため少ないメモリしか必要としない. エルミートまたは対称行列の場合にはまた三角部分だけが生成される.
帯幅が行列の次数に比べて大きい場合に方法Aが選択され, A()の行数は(密行列が格納できるように)少なくてもM必要である. 帯幅が小さい(< 0.5N (エルミートまたは対称の場合), < 0.3(N+M) (非対称の場合))場合, または, 帯幅 <= A()の行数 < M の場合には方法Bが選択される.
必要に応じて行列を圧縮する. Packオプションにより指定できるのは次のとおりである.
- 圧縮を行わない.
- 上半分を0にする(エルミート行列の場合).
- 下半分を0にする(エルミート行列の場合).
- 上半分を列ごとに格納(エルミート行列または上三角行列の場合).
- 下半分を列ごとに格納(エルミート行列または下三角行列の場合).
- 上三角部分を帯形式で格納(エルミート行列または上三角行列の場合).
- 下三角部分を帯形式で格納(エルミート行列または下三角行列の場合).
- 行列全体を帯形式で格納.
方法Bが選択され, 帯形式が指定されていれば, 帯形式の行列がダイレクトに生成されるため, 圧縮処理は不要である.
- 引数
-
| [in] | M | 行列の行数. (M >= 0) (エルミート行列あるいは対称行列の場合(すなわち Sym = "H", "S"または"P"の場合), M = Nでなければならない) |
| [in] | N | 行列の列数. (N >= 0) |
| [in] | Dist | ランダム固有値/特異値生成に使用する乱数の分布.
= "U": 一様分布 (0, 1).
= "S": 一様分布 (-1, 1).
= "N": 正規分布 (0, 1). |
| [in,out] | Iseed() | 配列 Iseed(LIseed - 1) (LIseed >= 4)
[in] 乱数発生ルーチンのシード. (0 <= Iseed(i) <= 4095, ただし Iseed(3)は奇数)
[out] Iseed()の値は変更され, 同じ乱数系列を続けるために次の呼び出しで使うことができる. |
| [in] | Sym | = "H": 生成される行列はエルミートで, 固有値がD(), Cond, ModeおよびDmaxで指定される. 固有値は正, 負または0である.
= "P": 生成される行列はエルミートで, 固有値(= 特異値)がD(), Cond, ModeおよびDmaxで指定される. 固有値は非負である.
= "S": 生成される行列は(複素)対称で, 特異値がD(), Cond, ModeおよびDmaxで指定される. 特異値は非負である.
= "N": 生成される行列は非対称で, 特異値がD(), Cond, ModeおよびDmaxで指定される. 特異値は非負である. |
| [in,out] | D() | 配列 D(LD - 1) (LD >= min(M, N))
[in] Mode = 0 の場合, D()にAの固有値あるいは特異値を入力する(上のSymを参照せよ).
[out] Mode <> 0の場合, D()は下記のようにMode, CondおよびDmax従って計算され, 設定される. |
| [in] | Mode | 特異値/固有値の指定方法:
= 0: D()にユーザーが入力する.
= 1: D(0) = 1. D(1〜Rank-1) = 1/Cond.
= 2: D(0〜Rank-2) = 1, D(Rank-1) = 1/Cond.
= 3: D(i) = Cond^(-i/(Rank-1)) (i = 0〜Rank-1).
= 4: D(i) = 1-i/(N-1)*(1-1/Cond) (i = 0〜N-1).
= 5: (1/Cond, 1)の範囲で対数値が一様に分布するようにランダムに設定する.
= 6: 行列の残りの部分と同じ分布でランダムに設定する.
< 0: |Mode|と同じであるがD()の中に逆順に入れる. 従って, Mode > 0であれば, D()の値は1〜1/Condの範囲に並ぶ. Mode < 0であれば, D()の値は1/Cond〜1の範囲に並ぶ.
Sym = "S"または"H" かつ Mode <> 0, 6および-6 の場合, さらにD()の要素に符号(+1または-1)をランダムに乗ずる. |
| [in] | Cond | 上記のModeの説明のように使用される. (Cond >= 1) |
| [in] | Dmax | Mode = -6, 0または6以外のとき, ModeおよびCondに従って計算されたD()の要素はDmax/max(abs(D(i))) によりスケーリングされ, 固有値または特異値の絶対値の最大値(すなわちノルム)がabs(Dmax)になる. Dmaxは正でなくてもよいことに注意せよ. Dmaxが負(または0)であれば, D()は負の値(または0)によりスケーリングされる. |
| [in] | Rank | Mode = 1, 2 または 3のとき, 行列のランク数を指定する. (1 <= Rank <= N)
D(Rank〜N-1) は0となる. |
| [in] | Kl | 行列の下帯幅 (Kl >= 0). 例えば, Kl = 0 は上三角行列, Kl = 1 は上ヘッセンベルグ形, そして, Kl >= M-1 は行列の下帯幅が最大であることを意味する. 対称またはエルミート行列の場合, Kl = Ku であること. |
| [in] | Ku | 行列の上帯幅 (Ku >= 0). 例えば, Ku = 0 は下三角行列, Ku = 1 は下ヘッセンベルグ形, そして, Ku >= N-1 は行列の上帯幅が最大であることを意味する. 対称またはエルミート行列の場合, Ku = Kl であること. |
| [in] | Pack | 行列の圧縮形式を指定する.
= "N": 圧縮しない.
= "U": 下三角要素をすべて0にする. (エルミートまたは対称行列の場合)
= "L": 上三角要素をすべて0にする. (エルミートまたは対称行列の場合)
= "C": 上三角要素を列方向に格納する. (エルミート, 対称あるいは上三角行列の場合)
= "R": 下三角要素を列方向に格納する. (エルミート, 対称あるいは下三角行列の場合)
= "Q": 上三角要素を帯形式で格納する. (エルミート, 対称あるいは上三角行列の場合)
= "B": 下三角要素を帯形式で格納する. (エルミート, 対称あるいは下三角行列の場合)
= "Z": 全体を帯形式で格納する. (Aを割り当て済の領域の末尾に格納する際に本オプションを用いるためにピボッティングが可能である)
LAPACKの行列形式表示との対応は次のとおりである.
GB: "Z"
PB, SB, HB または TB: "Q" または "B"
PP, SP, HP または TP: "C" または "R"
Packパラメータだけ変えて2回Zlatmtを呼び出すと, 数学的に同等の行列を生成する. |
| [out] | A() | 配列 A(LA1 - 1, LA2 - 1) (LA1 >= M (Pack = "N", "U" "L", "C" または "R"), min(Kl, M-1) (= min(Ku, N-1)) (Pack = "Q" または "B"), min(Ku, N-1) + min(Kl, M-1) + 1 (Pack = "Z"), LA2 >= N)
要求されたテスト行列. 行列はまずフル(非圧縮)形式で生成され, 次にPackで指定されていれば, 圧縮形式に変換される. 従って, 最初のN列の最初のM行は必ず書き込みがなされる. Packにより圧縮あるいは帯形式が指定されていれば, 最初のN列の全要素(LA1の最小必要数)に書き込みがされ, 生成された行列要素以外の部分の要素は0に設定される. |
| [out] | Info | = 0: 正常終了.
= -1: パラメータ M の誤り. (M < 0 または (M <> N かつ Sym = "S"または"H"))
= -2: パラメータ N の誤り. (N < 0)
= -3: パラメータ Dist の誤り. (Dist <> "U", "S"および"N")
= -4: パラメータ Iseed() の誤り.
= -5: パラメータ Sym の誤り. (Sym <> "S", "H", "P"および"N")
= -6: パラメータ D() の誤り.
= -7: パラメータ Mode の誤り. (Mode < -6 または Mode > 6)
= -8: パラメータ Cond の誤り. (Cond < 1)
= -10: パラメータ Rank の誤り. (Rank < 1 または Rank > N (Mode = 1, 2 または 3))
= -11: パラメータ Kl の誤り. (Kl < 0)
= -12: パラメータ Ku の誤り. (Ku < 0 または (Sym = "S", "H"または"P" かつ Kl <> Ku))
= -13: パラメータ Pack の誤り. (Pack <> "N", "U", "L", "C", "R", "Q", "B"または"Z")
= -14: パラメータ A() の誤り.
= 1: Dlatm1でエラー.
= 2: Dmaxによるスケーリングができなかった. (特異値の最大値が0)
= 3: Zlagge, ZlagheまたはZlagsyでエラー. |
- 出典
- LAPACK
|