|
|
◆ Zlatmr()
| Sub Zlatmr |
( |
M As |
Long, |
|
|
N As |
Long, |
|
|
Dist As |
String, |
|
|
Iseed() As |
Long, |
|
|
Sym As |
String, |
|
|
D() As |
Complex, |
|
|
Mode As |
Long, |
|
|
Cond As |
Double, |
|
|
Dmax As |
Complex, |
|
|
Rsign As |
String, |
|
|
Grade As |
String, |
|
|
Dl() As |
Complex, |
|
|
Model As |
Long, |
|
|
Condl As |
Double, |
|
|
Dr() As |
Complex, |
|
|
Moder As |
Long, |
|
|
Condr As |
Double, |
|
|
Pivtng As |
String, |
|
|
Ipivot() As |
Long, |
|
|
Kl As |
Long, |
|
|
Ku As |
Long, |
|
|
Sparse As |
Double, |
|
|
ANorm As |
Double, |
|
|
Pack As |
String, |
|
|
A() As |
Complex, |
|
|
Info As |
Long |
|
) |
| |
指定された対角要素を持つランダム行列の生成 (複素行列)
- 目的
- 本ルーチンは様々なタイプのランダム行列を生成する.
Zlatmrは以下の順に処理を行う.
分布Distのランダムな値の行列Aを生成する. Sym = "H"の場合はエルミート, Sym = "S"の場合は対称, Sym = "N"の場合は非対称行列を生成する.
対角要素をDとする. ただし, Dは入力値, または, 下記のようにMode, Cond, DmaxおよびRsignに基づいて求めた値である.
必要に応じて, Gradeで指定されたように, 左からおよび/または右から行列のグレーディングを行う. Dl, Model, Condl, Dr, ModerおよびCondrの入力値もまた下記のようにグレーディングに影響を与える.
必要に応じて, PivtngおよびIpivotで指定されたように, 行および/または列の入れ替えを行う.
必要に応じて, Sparseで指定されたように, ランダム疎行列を得るために要素をランダムに0に設定する.
必要に応じて下帯幅Klおよび上帯幅Kuの帯の外側を0にすることによりAを帯行列にする.
必要に応じて要素最大絶対値がANormとなるようにAをスケーリングする.
必要に応じて行列を圧縮する. Packオプションにより指定できるのは次のとおりである.
- 圧縮を行わない.
- 上半分を0にする(エルミートまたは対称行列の場合).
- 下半分を0にする(エルミートまたは対称行列の場合).
- 上半分を列ごとに格納(エルミート, 対称または上三角行列の場合).
- 下半分を列ごとに格納(エルミート, 対称または下三角行列の場合) (エルミート行列の場合, 複素共役な上半分を行ごとに格納するのと同じ. 対称行列の場合, 上半分を行ごとに格納するのと同じ).
- 上三角部分を帯形式で格納(エルミートまたは対称行列の場合).
- 下三角部分を帯形式で格納(エルミートまたは対称行列の場合).
- 行列全体を帯形式で格納.
注: Packパラメータだけ変えて2回Zlatmrを呼び出すと, 数学的に同等の行列を生成する. 2回のDlatmrの呼び出しが両方共最大帯幅(Kl = M-1 かつ Ku = N-1)で, PivtngおよびPackパラメータだけが異なる場合, 行および/または列の順序だけが異なり, 同一データの行列が生成される. この整合性は最大帯幅でなければ保たれない.
- 引数
-
| [in] | M | 行列Aの行数. (M >= 0) (エルミート行列あるいは対称行列の場合(すなわち Sym = "H"または"S"の場合), M = Nでなければならない) |
| [in] | N | 行列Aの列数. (N >= 0) |
| [in] | Dist | ランダム行列生成に使用する乱数の分布.
= "U": 一様分布 (0, 1).
= "S": 一様分布 (-1, 1).
= "D": 複素単位円の内側で一様分布.
= "N": 正規分布 (0, 1). |
| [in,out] | Iseed() | 配列 Iseed(LIseed - 1) (LIseed >= 4)
[in] 乱数発生ルーチンのシード. (0 <= Iseed(I) <= 4095. ただし, Iseed(3)は奇数)
[out] Iseed()の値は変更され, 同じ乱数系列を続けるために次の呼び出しで使うことができる. |
| [in] | Sym | = "H": 生成される行列はエルミート.
= "S": 生成される行列は対称.
= "N": 生成される行列は非対称. |
| [in,out] | D() | 配列 D(LD - 1) (LD >= min(M, N))
[in] Mode = 0 の場合, D()にAの対角要素を指定する.
[out] Mode <> 0の場合, D()は下記のようにModeおよびCondに従って設定される. |
| [in] | Mode | D()の使用方法:
= 0: D()にユーザーが入力する.
= 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)の範囲で対数値が一様に分布するようにランダムに設定する.
= 6: 行列の残りの部分と同じ分布でランダムに設定する.
< 0: |Mode|と同じであるがD()の中に逆順に入れる. 従って, Mode > 0であれば, D()の値は1〜1/Condの範囲に並ぶ. Mode < 0であれば, D()の値は1/Cond〜1の範囲に並ぶ. |
| [in] | Cond | 上記のModeの説明のように使用される. (Cond >= 1) |
| [in] | Dmax | Mode = -6, 0または6以外のとき, 対角要素は Dmax/max(abs(D(i))) によりスケーリングされ, 対角要素の絶対値の最大値はabs(Dmax)となる. Dmaxが複素数(または0)であれば, 対角要素は複素数の値(または0)によりスケーリングされる. |
| [in] | Rsign | Mode = -6, 0および6以外のとき, 対角要素の符号を次のように指定する.
= "T": 対角要素に一様分布する絶対値1のランダム複素数を乗ずる.
= "F": 対角要素は変更されない. |
| [in] | Grade | 行列のグレーディングを次のように指定する.
= "N": グレーディングを行わない.
= "L": 行列にdiag(Dl)を左から乗ずる (非対称行列の場合のみ).
= "R": 行列にdiag(Dr)を右から乗ずる (非対称行列の場合のみ).
= "B": 行列にdiag(Dl)を左から乗じ, diag(Dr)を右から乗ずる (非対称行列の場合のみ).
= "H": 行列にdiag(Dl)を左から乗じ, diag(conjg(Dl))を右から乗ずる (エルミート行列または非対称行列の場合のみ).
= "S": 行列にdiag(Dl)を左および右から乗ずる (対称または非対称行列の場合のみ).
= "E": 行列にdiag(Dl)を左から乗じ, inv(diag(Dl))を右から乗ずる (非対称行列の場合のみ) (M = N であること). |
| [in,out] | Dl() | 配列 Dl(LDl - 1) (LDl >= M)
Grade = "N"または"R"の場合, 参照されない.
[in] Model = 0 の場合, 上のGradeに説明されているように使用される対角行列の値を指定する. Grade = "E"の場合, D()には値が0の要素があってはならない.
[out] Model <> 0の場合, D()がModeとCondに従って設定されるのと同様に, ModelおよびCondlに従ってDl()が設定される(ただし, Dl()にはDmaxパラメータがない). |
| [in] | Model | ModeがD()をどのように計算するか指定するのと同様に, 配列Dl()の対角行列の値をどのように計算するか指定する. |
| [in] | Condl | Model <> 0の場合, 計算されたDl()の条件数を指定する. (Condl >= 1) |
| [in,out] | Dr() | 配列 Dr(LDr - 1) (LDr >= N)
Grade = "N", "L", "H", "S"または"E"の場合, 参照されない.
[in] Moder = 0 の場合, 上のGradeに説明されているように使用される対角行列の値を指定する.
[out] Moder <> 0の場合, D()がModeとCondに従って設定されるのと同様に, ModerおよびCondrに従ってDr()が設定される(ただし, Dr()にはDmaxパラメータがない). |
| [in] | Moder | ModeがD()をどのように計算するか指定するのと同様に, 配列Dr()の対角行列の値をどのように計算するか指定する. |
| [in] | Condr | Moder <> 0の場合, 計算されたDr()の条件数を指定する. (Condr >= 1) |
| [in] | Pivtng | ピボッティングによる行あるいは列の入れ替えを指定する:
= "N"または" ": 行わない.
= "L": 左あるいは行ピボッティングを行う (非対称行列でなければならない).
= "R": 右あるいは列ピボッティングを行う (非対称行列でなければならない).
= "B"または"F": 両方(完全ピボッティング)を行う (M = N であること).
2回のZlatmrの呼び出しが両方共最大帯幅(Kl = M-1 かつ Ku = N-1)で, PivtngおよびPackパラメータだけが異なる場合, 行および/または列の順序だけが異なる同一データの行列が生成される. この整合性は最大帯幅でなければ保たれない. |
| [in] | Ipivot[] | 配列 Ipivot(LIipivot - 1) (LIpivot >= N または M)
行あるいは列の入れ替えを指定する. 基本的な行列が生成された後で, 行, 列, あるいは両方が入れ替えられる. 例えば行ピボッティングが選択されたとすると, Zlatmrは最終行から始めてM番目とIpivot(M-1)番目の行を入れ替える. 次に最終の次の行にいき, M-1番目とIpivot(M-2)番目の行を入れ替える. 以下同様に行う. 2つ組で表すと, 入れ替えは (1 Ipivot(0)) (2 Ipivot(1)) ... (M Ipivot(M-1)) となる. ただし, 右から適用する.
Pivtng = "N"のときには参照されない. |
| [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] | Sparse | 疎行列を生成する場合に行列の0要素の割合を示す (0 <= Sparse <= 1). 行列を生成する際に, 要素ごとに(0, 1)の一様乱数xを発生させSparseと比較する. xが大きければその要素はそのままにし, 小さければ0にする. 従って, 平均的にSparseの割合の行列要素が0に設定される. |
| [in] | ANorm | ANorm >= 0 であれば出力行列の要素の最大値を指定する(出力行列にその要素の絶対値の最大値がANormになるように定数が乗算される).
ANorm < 0 であればスケーリングは行われない. |
| [in] | Pack | 行列の圧縮形式を指定する.
= "N": 圧縮しない.
= "U": 下三角要素をすべて0にする. (エルミートまたは対称行列の場合)
= "L": 上三角要素をすべて0にする. (エルミートまたは対称行列の場合)
= "C": 上三角要素を列方向に格納する. (エルミート, 対称または上三角行列の場合)
= "R": 下三角要素を列方向に格納する. (エルミート, 対称または下三角行列の場合) (エルミート行列の場合, 複素共役な上半分を行ごとに格納するのと同じ. 対称行列の場合, 上半分を行ごとに格納するのと同じ)
= "Q": 上三角要素を帯形式で格納する. (エルミートまたは対称行列の場合)
= "B": 下三角要素を帯形式で格納する. (エルミートまたは対称行列の場合)
= "Z": 全体を帯形式で格納する. (Aを割り当て済の領域の末尾に格納する際に本オプションを用いるためにピボッティングが可能である)
LAPACKの行列形式表示との対応は次のとおりである.
GB: "Z"
PB, HB or TB: "Q" or "B"
PP, HP or TP: "C" or "R"
Packパラメータだけ変えて2回Zlatmrを呼び出すと, 数学的に同等の行列を生成する. |
| [out] | A() | 配列 A(LA1 - 1, LA2 - 1) (LA1 >= M (Pack = "N", "U" または "L"), 1 (Pack = "C" または "R"), min(Ku + 1, N) + 1 (Pack = "Q" または "B"), min(Ku, N-1) + min(Kl, M-1) + 1 (Pack = "Z"), LA2 >= N)
要求されたテスト行列. Aの要素の中で出力時に意味のあるものだけが参照される(圧縮形式または帯形式であっても同様). 帯形式のAの使われていない角部分は0に設定される. |
| [out] | Info | = 0: 正常終了.
= -1: パラメータ M の誤り. (M < 0 または (M <> N かつ Sym = "S"または"H"))
= -2: パラメータ N の誤り. (N < 0)
= -3: パラメータ Dist の誤り. (Dist <> "U", "S", "D"および"N")
= -4: パラメータ Iseed() の誤り.
= -5: パラメータ Sym の誤り. (Sym <> "S", "H"および"N")
= -6: パラメータ D() の誤り.
= -7: パラメータ Mode の誤り. (Mode < -6 または Mode > 6)
= -8: パラメータ Cond の誤り. (Cond < 1)
= -10: パラメータ Rsign の誤り. (Rsign <> "T"および"F")
= -11: パラメータ Grade の誤り. (Grade <> "N", "L", "R", "B", S", "H" および "E")\n
= -12: パラメータ Dl() の誤り. (Grade = "E" かつ Dl()が0を含む)\n
= -13: パラメータ Model の誤り. (Model < -6 または Model > 6)\n
= -14: パラメータ Condl の誤り. (Condl < 1)\n
= -15: パラメータ Dr() の誤り.\n
= -16: パラメータ Moder の誤り. (Moder < -6 または Moder > 6)\n
= -17: パラメータ Condr の誤り. (Condr < 1)\n
= -18: パラメータ Pivtng の誤り. (Pivtng <> "N", " ", "L", "R", "B"および"F")\n
= -19: パラメータ Ipivot() の誤り. (Ipivot()が不正な値を含む)\n
= -20: パラメータ Kl の誤り. (Kl < 0)\n
= -21: パラメータ Ku の誤り. (Ku < 0 または (Sym = "S"または"H" かつ Kl <> Ku))\n
= -22: パラメータ Sparse の誤り. (Sparse < 0 または Sparse > 1)\n
= -24: パラメータ Pack の誤り. (Pack <> "N", "U", "L", "C", "R", "Q", "B"または"Z")
= -25: パラメータ A() の誤り.
= 1: Dlatm1でエラー. (D()の計算中)
= 2: Dmaxによるスケーリングができなかった. (特異値の最大値が0)
= 3: Dlatm1でエラー. (Dl()の計算中)
= 4: Dlatm1でエラー. (Dr()の計算中)
= 5: ANormは正であるがスケーリング前の行列が0のためスケーリングができなかった. |
- 出典
- LAPACK
|