XLPack 6.1
C/C++ API リファレンスマニュアル
読み取り中…
検索中…
一致する文字列を見つけられません

◆ _dlatmr()

void _dlatmr ( int  m,
int  n,
char  dist,
int  iseed[],
char  sym,
double  d[],
int  mode,
double  cond,
double  dmax,
char  rsign,
char  grade,
double  dl[],
int  model,
double  condl,
double  dr[],
int  moder,
double  condr,
char  pivtng,
int  ipivot[],
int  kl,
int  ku,
double  sparse,
double  anorm,
char  pack,
int  lda,
double  a[],
int  iwork[],
int *  info 
)

指定された対角要素を持つランダム行列の生成

目的
本ルーチンは様々なタイプのランダム行列を生成する.

dlatmrは以下の順に処理を行う.

分布distのランダムな値の行列Aを生成する. 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回dlatmrを呼び出すと, 数学的に同等の行列を生成する. 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).
= 'N': 正規分布 (0, 1).
[in,out]iseed[]配列 iseed[liseed] (liseed >= 4)
[in] 乱数発生ルーチンのシード. (0 <= iseed[i] <= 4095, ただし iseed[3]は奇数)
[out] iseed[]の値は変更され, 同じ乱数系列を続けるために次の呼び出しで使うことができる.
[in]sym= 'S'または'H': 生成される行列は対称.
= 'N': 生成される行列は非対称.
[in,out]d[]配列 d[ld] (ld >= min(m, n))
[in] mode = 0 の場合, d[]にAの対角要素を指定する.
[out] mode != 0の場合, d[]は下記のようにmodeおよびcondに従って設定される.
[in]moded[]の使用方法:
= 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]dmaxmode = -6, 0または6以外のとき, 対角要素は dmax/max(abs(d[i])) によりスケーリングされ, 対角要素の絶対値の最大値はabs(dmax)となる. dmaxが負(または0)であれば, 対角要素は負の値(または0)によりスケーリングされる.
[in]rsignmode = -6, 0および6以外のとき, 対角要素の符号を次のように指定する:
= 'T': 対角要素に確率0.5で1または-1を乗ずる.
= 'F': 対角要素は変更されない.
[in]grade行列のグレーディングを次のように指定する.
= 'N': グレーディングを行わない.
= 'L': 行列にdiag(dl)を左から乗ずる (非対称行列の場合のみ).
= 'R': 行列にdiag(dr)を右から乗ずる (非対称行列の場合のみ).
= 'B': 行列にdiag(dl)を左から乗じ, diag(dr)を右から乗ずる (非対称行列の場合のみ).
= 'S'または'H': 行列にdiag(dl)を左および右から乗ずる ('S'は対称行列, 'H'はエルミート行列を示す).
= 'E': 行列にdiag(dl)を左から乗じ, inv(diag(dl))を右から乗ずる ('E'は不変固有値を示す) (非対称行列の場合のみ) (m = n であること).
[in,out]dl[]配列 dl[ldl] (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]modelmodeがd[]をどのように計算するか指定するのと同様に, 配列dl[]の対角行列の値をどのように計算するか指定する.
[in]condlmodel != 0の場合, 計算されたdl[]の条件数を指定する. (condl >= 1)
[in,out]dr[]配列 dr[ldr] (ldr >= n)
grade = 'N', 'L', 'H', 'S'または'E'の場合, 参照されない.
[in] moder = 0 の場合, 上のgradeに説明されているように使用される対角行列の値を指定する.
[out] moder != 0の場合, d[]がmodeとcondに従って設定されるのと同様に, moderおよびcondrに従ってdr[]が設定される(ただし, dr[]にはdmaxパラメータがない).
[in]modermodeがd[]をどのように計算するか指定するのと同様に, 配列dr[]の対角行列の値をどのように計算するか指定する.
[in]condrmoder != 0の場合, 計算されたdr[]の条件数を指定する. (condr >= 1)
[in]pivtngピボッティングによる行あるいは列の入れ替えを指定する:
= 'N'または' ': 行わない.
= 'L': 左あるいは行ピボッティングを行う (非対称行列でなければならない).
= 'R': 右あるいは列ピボッティングを行う (非対称行列でなければならない).
= 'B'または'F': 両方(完全ピボッティング)を行う (m = n であること).

2回のdlatmrの呼び出しが両方共最大帯幅(kl = m-1 かつ ku = n-1)で, pivtngおよびpackパラメータだけが異なる場合, 行および/または列の順序だけが異なる同一データの行列が生成される. この整合性は最大帯幅でなければ保たれない.
[in]ipivot[]配列 ipivot[lipivot] (lipivot >= n または m)
行あるいは列の入れ替えを指定する. 基本的な行列が生成された後で, 行, 列, あるいは両方が入れ替えられる. 例えば行ピボッティングが選択されたとすると, dlatmrは最終行から始めてm番目とipivot[m-1]番目の行を入れ替える. 次に最終の次の行にいき, m-1番目とipivot[m-2]番目の行を入れ替える. 以下同様に行う. 2つ組で表すと, 入れ替えは(1 ipivot[0]) (2 ipivot[1]) ... (m ipivot[m-1]) となる. ただし, 右から適用する.
pivtng = 'N'のときには参照されない.
[in]sparse疎行列を生成する場合に行列の0要素の割合を示す (0 <= sparse <= 1). 行列を生成する際に, 要素ごとに(0, 1)の一様乱数xを発生させsparseと比較する. xが大きければその要素はそのままにし, 小さければ0にする. 従って, 平均的にsparseの割合の行列要素が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]anormanorm >= 0 であれば出力行列の要素の最大値を指定する(出力行列にその要素の絶対値の最大値がanormになるように定数が乗算される).
anorm < 0 であればスケーリングは行われない.
[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回dlatmrを呼び出すと, 数学的に同等の行列を生成する.
[in]lda二次元配列a[][]の整合寸法. (lda >= max(1, m) (pack = 'N', 'U'または'L'の場合), lda >= 1 (pack = 'C'または'R'の場合), lda >= min(ku + 1, n) (pack = 'Q'または'B'の場合), lda >= min(ku, n-1)+min(kl, m-1)+1 (pack = 'Z'の場合))
[out]a[][]配列 a[la][lda] (la >= n)
要求されたテスト行列. Aの要素の中で出力時に意味のあるものだけが参照される(圧縮形式または帯形式であっても同様). 帯形式のAの使われていない角部分は0に設定される.
[out]iwork[]配列 iwork[liwork] (liwork >= m または n)
作業領域.
pivtng = 'N'の時には参照されない.
[out]info= 0: 正常終了
= -1: 入力パラメータ m の誤り (m < 0 または (m != n かつ sym = 'S'または'H'))
= -2: 入力パラメータ n の誤り (n < 0)
= -3: 入力パラメータ dist の誤り (dist != 'U', 'S'および'N')
= -5: 入力パラメータ sym の誤り (sym != 'S', 'H'および'N')
= -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')
= -12: 入力パラメータ dl の誤り (grade = 'E' かつ dl[]が0を含む)
= -13: 入力パラメータ model の誤り (model < -6 または model > 6)
= -14: 入力パラメータ condl の誤り (condl < 1)
= -16: 入力パラメータ moder の誤り (moder < -6 または moder > 6)
= -17: 入力パラメータ condr の誤り (condr < 1)
= -18: 入力パラメータ pivtng の誤り (pivtng != 'N', ' ', 'L', 'R', 'B'および'F')
= -19: 入力パラメータ ipivot の誤り (ipivot[]が不正な値を含む)
= -20: 入力パラメータ kl の誤り (kl < 0)
= -21: 入力パラメータ ku の誤り (ku < 0 または (sym = 'S'または'H' かつ kl != ku))
= -22: 入力パラメータ sparse の誤り (sparse < 0 または sparse > 1)
= -24: 入力パラメータ pack の誤り (pack != 'N', 'U', 'L', 'C', 'R', 'Q', 'B'または'Z')
= -25: 入力パラメータ lda の誤り (ldaが小さすぎる)
= 1: dlatm1でエラー (d[]の計算中)
= 2: dmaxによるスケーリングができなかった(特異値の最大値が0)
= 3: dlatm1でエラー (dl[]の計算中)
= 4: dlatm1でエラー (dr[]の計算中)
= 5: anormは正であるがスケーリング前の行列が0のためスケーリングができなかった.
出典
LAPACK