1
imeth = 0 同 ア 使用す
特異値 け 求 場合 dqds ア
Fernando and Parlett, 1994 使う 特異値ベク も求 場合 分 割統治法 用い
フ : imeth = 0
注意:LAPACKア LAPACK ー す ベンダー提供 イ が使
え 場合に用い こ が ます 例え Intel® Math Kernel Library (MKL) や
SunTM High Performance Library す そ 以外 IMSLア が使
わ ます
IMSL_A_COL_DIM, int a_col_dim 。入力) 配列 a 列次元
フ : a_col_dim = n IMSL_RETURN_USER, float s[] 。出力)
大 さ min (m, n) ー 割 当 配列 非増加 順 最初 min (m, n) 個 位置に
A 特異値 含 IMSL_RETURN_USER 使用す imsl_f_lin_svd_gen 戻 値 s に ます
IMSL_RANK, float tol, int *rank 。入力/出力) float tol (入力)
特異値が無視 ロ 置 換え こ 決 に使用さ 許容値 含
tol > 0 あ 特異値 si,i si,i
tol あ 無視さ ます tol <0 あ 特異値 si,i si,i
|tol|*||A||∞ あ 無視 考え ますこ 場合 |tol| 相対誤差 推定値又 ータ 確定性 す
int *rank 。入力/出力)
A ンク 推定値 含 整数
IMSL_U, float **p_u 。出力)
A min 。m, n)個 左特異ベク 含 大 さ m ×min 。m, n) 配列へ インタ
ア 戻 必要 領域 imsl_f_lin_svd_gen によ 割 当 ま
す 一般に float *p_u が宣言さ &p_u が引数 し 使用さ ます
IMSL_U_USER, float u[] 。出力)
A min (m, n) 個 左特異ベク 含 大 さ m ×min (m, n) ー 割 当
配列 左特異ベク 配列 a 領域 使用し 返さ ます 左 右 特異ベク 戻 値 同時に a 領域 使用 いこ に注意し く さい
IMSL_U_COL_DIM, int u_col_dim 。入力) 左特異ベク 含 配列 列次元
フ : u_col_dim = min (m, n) IMSL_V, float **p_v 。出力)
A 右特異ベク 含 大 さ n ×min 。m, n) 配列へ インタ ア 戻 必要 領域 imsl_f_lin_svd_gen によ 割 当 ます 一般に float
*p_v が宣言さ &p_v が引数 し 使用さ ます IMSL_V_USER, float v[] 。出力)
A 右特異ベク 含 大 さ n ×min 。m, n) ー 割 当 配列 右特異ベ ク 配列 a 領域 使用し 返すこ が ます 左 右 特異ベク 戻 値
同時に a 領域 使用 いこ に注意し く さい IMSL_V_COL_DIM, int v_col_dim 。入力)
右特異ベク 含 配列 列次元 フ : v_col_dim = n
IMSL_INVERSE, float **p_gen_inva 。出力)
A 一般化逆行列 含 大 さ n ×m 配列へ インタ ア 戻 必要 領域 imsl_f_lin_svd_gen によ 割 当 ます 一般的に float
*p_gen_inva が宣言さ &p_gen_inva が引数 し 使用さ ます IMSL_INVERSE_USER, float gen_inva[] 。出力)
A 一般化逆行列 含 大 さ n ×m ー 割 当 配列 IMSL_INV_COL_DIM, int gen_inva_col_dim 。入力)
行列 A 一般化逆行列 含 配列 列次元 フ : gen_inva_col_dim = m
説明
関数 imsl_f_lin_svd_gen 実行列 A 特異値分解 計算します そ 最初ハウ ダー変換 前後に適用す こ によ 行列 A 二重対角行列 B に縮約します そ B 特異値分解 陰型 フ QR法 使用し 計算します 行列 A ンク 推定値 sk,k
tol あ い sk,k
|tol|*||A||∞ 最小 整数 k 見 け こ によ 得 ます
si+1, i+1
si,i あ 全 si,i i = k, , min 。m, n) -1 に対し 同 等号 満足しますンク 値 k -1 さ ます A = USVT あ そ 一般化逆行列 A+ = VS+U T に ます ここ
S diag
(
s1,11,...,
si,i1, 0 ,..., 0 )
無視 い特異値 けが逆数にさ ます IMSL_INVERSE 又 IMSL_INVERSE_USER が指定さ こ 関数 最初に行列 A 特異値分解 計算し 次に一般化逆行列 計算します 関数
imsl_f_lin_svd_gen QRア が個々 特異値 特定す に30回 反復 も 束し い
場合 ー ます
例題 1
こ 例題 実数 6 ×4 行列 特異値 計算します
#include <imsl.h>
float a[] = {1.0, 2.0, 1.0, 4.0, 3.0, 2.0, 1.0, 3.0, 4.0, 3.0, 1.0, 4.0, 2.0, 1.0, 3.0, 1.0, 1.0, 5.0, 2.0, 2.0, 1.0, 2.0, 2.0, 3.0};
int main() {
int m = 6, n = 4;
float *s;
/* Compute singular values */
s = imsl_f_lin_svd_gen (m, n, a, 0);
/* Print singular values */
imsl_f_write_matrix ("Singular values", 1, n, s, 0);
}
出力
Singular values
1 2 3 4
11.49 3.27 2.65 2.09
例題 2
こ 例題 実数 6 ×4 実数行列 A 特異値 計算します こ 特異値 ー 提供 配列に返さ ます 行列 U V 関数 imsl_f_lin_svd_gen によ 提供さ 領域に返さ ます
#include <imsl.h>
float a[] = {1.0, 2.0, 1.0, 4.0, 3.0, 2.0, 1.0, 3.0, 4.0, 3.0, 1.0, 4.0, 2.0, 1.0, 3.0, 1.0, 1.0, 5.0, 2.0, 2.0, 1.0, 2.0, 2.0, 3.0};
int main() {
int m = 6, n = 4;
float s[4], *p_u, *p_v;
/* Compute SVD */
imsl_f_lin_svd_gen (m, n, a,
IMSL_RETURN_USER, s, IMSL_U, &p_u,
IMSL_V, &p_v, 0);
/* Print decomposition*/
imsl_f_write_matrix ("Singular values, S", 1, n, s, 0);
imsl_f_write_matrix ("Left singular vectors, U", m, n, p_u, 0);
imsl_f_write_matrix ("Right singular vectors, V", n, n, p_v, 0);
}
出力
Singular values, S
1 2 3 4 11.49 3.27 2.65 2.09
Left singular vectors, U 1 2 3 4 1 -0.3805 0.1197 0.4391 -0.5654 2 -0.4038 0.3451 -0.0566 0.2148 3 -0.5451 0.4293 0.0514 0.4321 4 -0.2648 -0.0683 -0.8839 -0.2153 5 -0.4463 -0.8168 0.1419 0.3213 6 -0.3546 -0.1021 -0.0043 -0.5458
Right singular vectors, V 1 2 3 4 1 -0.4443 0.5555 -0.4354 0.5518 2 -0.5581 -0.6543 0.2775 0.4283 3 -0.3244 -0.3514 -0.7321 -0.4851 4 -0.6212 0.3739 0.4444 -0.5261
例題 3
こ 例題 3 ×2 行列 A ンク 一般化逆行列 計算します ンク 2 ×3 一般化逆行列 A+
がプ ン さ ます
#include <imsl.h>
#include <stdio.h>
float a[] = {1.0, 0.0, 1.0, 1.0, 100.0, -50.0};
int main()
{
int m = 3, n = 2;
float tol;
float gen_inva[6];
float *s;
int rank;
/* Compute generalized inverse */
tol = 1.e-4;
s = imsl_f_lin_svd_gen (m, n, a, IMSL_RANK, tol, &rank,
IMSL_INVERSE_USER, gen_inva, IMSL_INV_COL_DIM, m,
0);
/* Print rank, singular values and */
/* generalized inverse. */
printf ("Rank of matrix = %2d", rank);
imsl_f_write_matrix ("Singular values", 1, n, s, 0);
imsl_f_write_matrix ("Generalized inverse", n, m, gen_inva, IMSL_A_COL_DIM, m,
0);
}
出力
Rank of matrix = 2 Singular values
1 2 111.8 1.4 Generalized inverse
1 2 3
1 0.100 0.300 0.006
2 0.200 0.600 -0.008
警告 ー
IMSL_SLOWCONVERGENT_MATRIX 30回 反復 も 束しませ した
IMSL_UPDATE_PROCESS_FAILED 特異値 計算 た 分割統治法 更新が失敗した