• 検索結果がありません。

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 ます ここ

   Sdiag

(

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 特異値 計算 た 分割統治法 更新が失敗した