|
|
◆ _dlatms()
| void _dlatms |
( |
int |
m, |
|
|
int |
n, |
|
|
char |
dist, |
|
|
int |
iseed[], |
|
|
char |
sym, |
|
|
double |
d[], |
|
|
int |
mode, |
|
|
double |
cond, |
|
|
double |
dmax, |
|
|
int |
kl, |
|
|
int |
ku, |
|
|
char |
pack, |
|
|
int |
lda, |
|
|
double |
a[], |
|
|
double |
work[], |
|
|
int * |
info |
|
) |
| |
指定された特異値を持つランダム行列/指定された固有値を持つ対称ランダム行列の生成
- 目的
- 本ルーチンは指定された特異値を持つランダム行列(または指定された固有値を持つ対称ランダム行列)を生成する.
dlatmsは以下の順に処理を行う.
対角要素をdとする. ただし, dは入力値, または, 下記のようにmode, cond, dmaxおよびsymに基づいて求めた値である.
次の2つの方法のどちらかにより, 適切な帯構造で行列を生成する.
- 方法A:
左からDを, また, 右からランダムユニタリ行列を乗算しm×n密行列を生成する. 次に, klおよびkuに従ってハウスホルダー変換により帯幅を減らす.
- 方法B:
帯幅-0(すなわち, 対角)行列をギブンス回転により帯幅-1行列に変換する. 続いて, 帯幅-1行列を帯幅-2行列に変換する. 以下同様. (mおよびnに比べて)適度に小さな帯幅の場合, この方法は密行列を生成しないため少ないメモリしか必要としない. 対称行列の場合にはまた三角部分だけが生成される.
帯幅が行列の次数に比べて大きい場合に方法Aが選択され, ldaは(密行列が格納できるように)少なくてもm必要である. 帯幅が小さい(< 0.5n (対称の場合), < 0.3(n+m) (非対称の場合))場合, または, 帯幅 <= lda < m の場合には方法Bが選択される.
必要に応じて行列を圧縮する. packオプションにより指定できるのは次のとおりである.
- 圧縮を行わない.
- 上半分を0にする(対称行列の場合).
- 下半分を0にする(対称行列の場合).
- 上半分を列ごとに格納(対称行列または上三角行列の場合).
- 下半分を列ごとに格納(対称行列または下三角行列の場合) (対称行列の場合, 上半分を行ごとに格納するのと同じ).
- 上三角部分を帯形式で格納(対称行列の場合).
- 下三角部分を帯形式で格納(対称行列の場合).
- 行列全体を帯形式で格納.
方法Bが選択され, 帯形式が指定されていれば, 帯形式の行列がダイレクトに生成されるため, 圧縮処理は不要である.
- 引数
-
| [in] | m | 行列の行数. (m >= 0) (対称行列の場合(すなわち sym = 'S', 'H'または'P'の場合), m = nでなければならない) |
| [in] | n | 行列の列数. (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] | sym | = 'S' または 'H': 生成される行列は対称で, 固有値がd[], cond, modeおよびdmaxで指定される. 固有値は正, 負または0である.
= 'P': 生成される行列は対称で, 固有値(= 特異値)がd[], cond, modeおよびdmaxで指定される. 固有値は非負である.
= 'N': 生成される行列は非対称で, 特異値がd[], cond, modeおよびdmaxで指定される. 特異値は非負である. |
| [in,out] | d[] | 配列 d[ld] (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〜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の範囲に並ぶ.
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] | 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 または TB: 'Q' または 'B'
PP, SP または TP: 'C' または 'R'
packパラメータだけ変えて2回dlatmsを呼び出すと, 数学的に同等の行列を生成する. |
| [in] | lda | 二次元配列a[][]の整合寸法. (lda >= m (pack = 'N', 'U', 'L', 'C'または'R'の場合), lda >= min(kl, m-1) (= min(ku, n-1)) (pack = 'Q'または'B'の場合), lda >= min(ku, n-1) + min(kl, m-1) + 1 (pack = 'Z'の場合)) |
| [out] | a[][] | 配列 a[la][lda] (la >= n)
要求されたテスト行列. 行列はまずフル(非圧縮)形式で生成され, 次にpackで指定されていれば, 圧縮形式に変換される. 従って, 最初のn列の最初のm行は必ず書き込みがなされる. packにより圧縮あるいは帯形式が指定されていれば, 最初のn列の全lda要素に書き込みがされ, 生成された行列要素以外の部分の要素は0に設定される. |
| [out] | work[] | 配列 work[lwork] (lwork >= 3*max(m, n))
作業領域. |
| [out] | info | = 0: 正常終了
= -1: 入力パラメータ m の誤り (m < 0 または (m != n かつ sym = 'S', 'H'または 'P'))
= -2: 入力パラメータ n の誤り (n < 0)
= -3: 入力パラメータ dist の誤り (dist != 'U', 'S'および'N')
= -5: 入力パラメータ sym の誤り (sym != 'S', 'H', 'P'および'N')
= -7: 入力パラメータ mode の誤り (mode < -6 または mode > 6)
= -8: 入力パラメータ cond の誤り (cond < 1)
= -10: 入力パラメータ kl の誤り (kl < 0)
= -11: 入力パラメータ ku の誤り (ku < 0 または (sym = 'S', 'H'または'P' かつ kl != ku))
= -12: 入力パラメータ pack の誤り (pack != 'N', 'U', 'L', 'C', 'R', 'Q', 'B'または'Z')
= -13: 入力パラメータ lda の誤り (ldaが小さすぎる)
= 1: dlatm1でエラー
= 2: dmaxによるスケーリングができなかった(特異値の最大値が0)
= 3: dlaggeまたはdlagsyでエラー |
- 出典
- LAPACK
|