XLPack 7.0
XLPack 数値計算ライブラリ (C API) リファレンスマニュアル
読み取り中…
検索中…
一致する文字列を見つけられません

◆ dgssvd()

void dgssvd ( char  jobv,
char  jobu,
int  m,
int  n,
const double  val[],
const int  ptr[],
const int  ind[],
int  base,
int  format,
double  s[],
const char *  which,
int  nev,
double  tol,
double  resid[],
int  ncv,
int  ldv,
double  v[],
int  ldu,
double  u[],
int  maxiter,
double  workd[],
double  workl[],
int  lworkl,
double  workv[],
int  iwork[],
int *  info 
)

特異値分解 (SVD) (一般疎行列) (ドライバ)

目的
行列 A の特異値(s)と対応する右特異ベクトル(v)を, 次の対称固有値問題を解くことによって, 求める.
(A^T*A)*v = s^2*v
A は m x n 実一般疎行列である. 必要であれば, 左特異ベクトルも u = A*v/s によって求められる.

疎行列 A は CSC または CSR 形式で格納されているものとする.

対称固有値問題は, arpack ルーチン dsaupd および dseupd を使用し, リスタート付きランチョス法 (Implicitly restarted Lanczos method (IRLM)) により解く.
引数
[in]jobv= 'N': 右特異ベクトルを計算しない.
= 'V': 右特異ベクトルを計算する.
[in]jobu= 'N': 左特異ベクトルを計算しない.
= 'V': 左特異ベクトルを計算する. (jobv も 'V' でなければならない.)
[in]m行列の行数. (m >= 0) (m = 0 の場合, 処理を行わずに戻る)
[in]n行列の列数. (n >= 0) (n = 0 の場合, 処理を行わずに戻る)
[in]val[]配列 val[lval] (lval >= nnz)
入力行列の非ゼロ要素の値. (nnz は非ゼロ要素数)
[in]ptr[]配列 ptr[lptr] (lptr >= n + 1)
入力行列の列ポインタ(CSC形式の場合)または行ポインタ(CSR形式の場合).
[in]ind[]配列 ind[lind] (lind >= nnz)
入力行列の行インデクス(CSC形式の場合)または列インデクス(CSR形式の場合). (nnz は非ゼロ要素数)
[in]baseptr[] および ind[] のインデクス形式.
= 0: 0-ベース(C形式): 開始インデクス値が 0.
= 1: 1-ベース(Fortran形式): 開始インデクス値が 1.
[in]format行列の格納形式.
= 0: CSR 形式.
= 1: CSC 形式.
[out]s[]配列 s[ls] (ls >= nev)
A の特異値を返す. 値は昇順に格納される.
[in]which= "LA": 最大のものから nev 個の特異値を求める.
= "SA": 最小のものから nev 個の特異値を求める.
= "LM": 絶対値最大のものから nev 個の特異値を求める.
= "SM": 絶対値最小のものから nev 個の特異値を求める.
= "BE": スペクトルの両端から半分づつ, 合計 nev 個の特異値を求める. nev が奇数の場合, 大きい側を1個多く求める.
[in]nev求める特異値の数. (0 < nev < n)
[in]tol停止基準: 特異値の最大相対誤差. tol <= 0 の場合, マシン精度とみなす.
[out]resid[]配列 resid[lresid] (lresid >= n)
残差ベクトル.
[in]ncv各反復において生成されるランチョス基底ベクトルの数. (nev < ncv <= n) (ncv >= 2*nev が推奨される)
[in]ldv配列 v の整合寸法. (ldv >= n)
[out]v[]配列 v[ldv * lv] (lv >= nev)
nev本の右特異ベクトル. jobv = 'N' の場合, 参照されない.
[in]ldu配列 u の整合寸法. (ldu >= m)
[out]u[]配列 u[ldu * lu] (lu >= nev)
nev本の左特異ベクトル. jobu = 'N' の場合, 参照されない.
[in]maxiterランチョス反復の最大回数.
[out]workd[]配列 workd[lworkd] (lworkd >= 3*n)
リバースコミュニケーションに使われる分散作業領域.
[out]workl[]配列 workl[lworkl]
ローカル作業領域.
[in]lworkl配列 workl[]のサイズ. (lworkl >= ncv^2 + 8*ncv)
[out]workv[]配列 workv[lworkv] (lworkv >= n*ncv)
倍精度作業領域.
[out]iwork[]配列 iwork[liwork] (liwork >= max(ncv, 3))
整数作業領域.
iwork[0], ..., iwork[2] に次の値を返す.
iwork[0]: ランチョス反復回数.
iwork[1]: 収束条件を満たすリッツ値の数 (nconv).
iwork[2]: OP*x 操作の回数 (numop).
[out]infoリターンコード.
= 0: 正常終了.
< 0: (-info)番目の入力パラメータの誤り.
= 1: 最大反復回数に達した.
= 3: リスタート付きランチョス反復中にシフト値が適用できなかった. ncv を nev に比較して大きくすると改善するかもしれない (ncv >= 2*nev が推奨される).
= 11: 初期残差ベクトルが 0 である.
= 12: ランチョス分解に失敗した.
= 13: LAPACK ルーチンで固有値の計算に失敗した.
= 14: dsaupd は十分な精度の固有値を得られなかった.
= 15, 16: 内部処理エラー.