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

◆ dgelss()

void dgelss ( int  m,
int  n,
int  nrhs,
int  lda,
double  a[],
int  ldb,
double  b[],
double  s[],
double  rcond,
int *  rank,
double  work[],
int  lwork,
int *  info 
)

優決定または劣決定系連立一次方程式 Ax = b の解 (特異値分解 (SVD))

目的
本ルーチンは線形最小二乗問題の最小ノルム解を A の特異値分解(SVD)を使って求める.
|| A * X - B || を最小化する.
A は m x n 行列で, ランク落ちしていてもよい.
いくつかの右辺ベクトル b および解ベクトル x を 1 回の呼び出しで扱うことができる. これらのベクトルは, m x nrhs 右辺行列 B および n x nrhs 解行列 X の列として格納される.

A の有効ランク数は, 最大の特異値の rcond 倍よりも小さな特異値を 0 として扱うことにより決められる.
引数
[in]m行列 A の行数. (m >= 0) (m = 0 の場合, rank = 0 として戻る)
[in]n行列 A の列数. (n >= 0) (n = 0 の場合, rank = 0 として戻る)
[in]nrhs右辺の数, すなわち, 行列 B および X の列数. (nrhs >= 0)
[in]lda二次元配列 a[][] の整合寸法. (lda >= max(1, m))
[in,out]a[][]配列 a[la][lda] (la >= n)
[in] m x n 行列 A.
[out] a[][] の最初のmin(m, n)行はその右特異ベクトル(行ごとに格納)により上書きされる.
[in]ldb二次元配列 b[][] の整合寸法. (ldb >= max(1, m, n))
[in,out]b[][]配列 b[lb][ldb] (lb >= nrhs)
[in] m x nrhs 右辺行列 B.
[out] b[][] は n x nrhs 解行列 X により上書きされる. m >= n かつ rank = n の場合, i 列の解の残差二乗和は同じ列の n〜m-1 番要素の二乗和で与えられる.
[out]s[]配列 s[ls] (ls >= min(m, n))
行列Aの特異値 (降順).
A の2-ノルムによる条件数は s[0]/s[min(m, n)-1] である.
[in]rcondrcond は A の有効ランク数を決めるために使われる.
s[i] <= rcond*s[0] となる特異値は 0 として扱われる. rcond < 0 の場合, 代わりにマシンイプシロンが使われる.
[out]rankA の有効ランク数, すなわち, rcond*s[0] より大きい特異値の数.
[out]work[]配列 work[lwork]
作業領域.
終了時, info = 0 であれば, work[0] に lwork の最適値を返す.
[in]lwork配列 work[]のサイズ. (lwork >= max(1, 3*min(m, n) + max(2*min(m, n), max(m, n), nrhs)))
一般に, パフォーマンスをよくするためには lwork をより大きくとらなければならない.
lwork = -1 の場合, 作業領域サイズの問い合わせとみなし, 最適サイズを求める計算だけを行い, work[0] にその値を返す.
[out]info= 0: 正常終了
= -1: 入力パラメータ m の誤り (m < 0)
= -2: 入力パラメータ n の誤り (n < 0)
= -3: 入力パラメータ nrhs の誤り (nrhs < 0)
= -4: 入力パラメータ lda の誤り (lda < max(1, m))
= -6: 入力パラメータ ldb の誤り (ldb < max(1, m, n))
= -12: 入力パラメータ lwork の誤り (lwork が小さすぎる)
= i > 0: SVD の計算アルゴリズムが収束しなかった. 中間結果の二重対角形の副対角要素のうち i 個が 0 に収束しなかった.
出典
LAPACK