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

0 ベク 計算す 使う そ 以外 dqds ア Fernando and Parlett, 1994 使う

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, f_complex s[] (出力)

最初 min(m,n) 個 位置に A 特異値 非増加 順番 含 長さ min (m, n) ー 割 当 配列 IMSL_RETURN_USER が使用さ imsl_c_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, f_complex **p_u 。出力)

A min 。m, n)個 左特異ベク 含 大 さ m ×min 。m, n) 配列へ インタ

ア 戻 必要 領域 imsl_c_lin_svd_gen によ 割 当 ます

一般に f_complex *p_u が宣言さ &p_u が引数 し 使用さ ます

IMSL_U_USER, f_complex 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, f_complex **p_v 。出力)

A 右特異ベク 含 大 さ n ×min 。m, n) 配列へ インタ ア 戻 必要 領域 imsl_c_lin_svd_gen によ 割 当 ます 一般に

f_complex *p_v が宣言さ &p_v が引数 し 使用さ ます

IMSL_V_USER, f_complex v[] 。出力)

A 右特異ベク 含 大 さ n ×min 。m, n) ー 割 当 配列 右特異ベク 配列 a 領域 使用し 返すこ が ます 左 右 特異ベク 戻 値 同 時に a 領域 使用 いこ に注意し く さい

IMSL_V_COL_DIM, int v_col_dim 。入力)

右特異ベク 含 配列 列次元 フ : v_col_dim = n

IMSL_INVERSE, f_complex **p_gen_inva 。出力)

A 一般化逆行列 含 大 さ n ×m 配列へ インタ ア 戻 必要 領 域 imsl_c_lin_svd_gen によ 割 当 ます 一般的に f_complex

*p_gen_inva が宣言さ &p_gen_inva が引数 し 使用さ ます IMSL_INVERSE_USER, f_complex gen_inva[] 。出力)

A 一般化逆行列 含 大 さ n ×m ー 割 当 配列 IMSL_INV_COL_DIM, int gen_inva_col_dim 。入力)

行列 A 一般化逆行列 含 配列 列次元 フ : gen_inva_col_dim = m

説明

関数 imsl_c_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 = USV H 一般化逆行列 A+ = VS+U H ます ここ

  

(

1

,...,

,1

, 0 ,..., 0 )

1 ,

1

diag s sii

S

無視 い特異値 けが逆数にさ ます IMSL_INVERSE 又 IMSL_INVERSE_USER が指定さ こ 関数 最初に行列 A 特異値分解 計算し 次に一般化逆行列 計算します 関数

imsl_f_lin_svd_gen QRア が個々 特異値 特定す に30回 反復 も 束し い

場合 ー ます

例題 1

こ 例題 6  3 複素行列 特異値 計算します

#include <imsl.h>

int main() {

int m = 6, n = 3;

f_complex *s;

f_complex a[] = {{1.0, 2.0}, {3.0, 2.0}, {1.0,-4.0}, {3.0,-2.0}, {2.0,-4.0}, {1.0, 3.0}, {4.0, 3.0}, {-2.0,1.0}, {1.0, 4.0}, {2.0,-1.0}, {3.0, 0.0}, {3.0,-1.0}, {1.0,-5.0}, {2.0,-5.0}, {2.0, 2.0}, {1.0, 2.0}, {4.0,-2.0}, {2.0,-3.0}};

/* Compute singular values */

s = imsl_c_lin_svd_gen (m, n, a, 0);

/* Print singular values */

imsl_c_write_matrix ("Singular values", 1, n, s, 0);

}

出力

Singular values

1 2 3 ( 11.77, 0.00) ( 9.30, 0.00) ( 4.99, 0.00)

例題 2

こ 例題 6 × 3 複素数行列 A 特異値 計算します こ 特異値 ー 提供 配列に返さ ます 行列 U V 関数 imsl_c_lin_svd_gen によ 提供さ 領域に返さ ます

#include <imsl.h>

int main() {

int m = 6, n = 3;

f_complex s[3], *p_u, *p_v;

f_complex a[] = {{1.0, 2.0}, {3.0, 2.0}, {1.0,-4.0}, {3.0,-2.0}, {2.0,-4.0}, {1.0, 3.0},

{4.0, 3.0}, {-2.0,1.0}, {1.0, 4.0}, {2.0,-1.0}, {3.0, 0.0}, {3.0,-1.0}, {1.0,-5.0}, {2.0,-5.0}, {2.0, 2.0}, {1.0, 2.0}, {4.0,-2.0}, {2.0,-3.0}};

/* Compute SVD of a */

imsl_c_lin_svd_gen (m, n, a,

IMSL_RETURN_USER, s, IMSL_U, &p_u,

IMSL_V, &p_v, 0);

/* Print decomposition factors */

imsl_c_write_matrix ("Singular values, S", 1, n, s, 0);

imsl_c_write_matrix ("Left singular vectors, U", m, n, p_u, 0);

imsl_c_write_matrix ("Right singular vectors, V", n, n, p_v, 0);

}

出力

Singular values, S

1 2 3 ( 11.77, 0.00) ( 9.30, 0.00) ( 4.99, 0.00)

Left singular vectors, U

1 2 3 1 ( 0.1968, 0.2186) ( 0.5011, 0.0217) ( -0.2007, -0.1003) 2 ( 0.3443, -0.3542) ( -0.2933, 0.0248) ( 0.1155, -0.2338) 3 ( 0.1457, 0.2307) ( -0.5424, 0.1381) ( -0.4361, -0.4407) 4 ( 0.3016, -0.0844) ( 0.2157, 0.2659) ( -0.0523, -0.0894) 5 ( 0.2283, -0.6008) ( -0.1325, 0.1433) ( 0.3152, -0.0090) 6 ( 0.2876, -0.0350) ( 0.4377, -0.0400) ( 0.0458, -0.6205)

Right singular vectors, V

1 2 3 1 ( 0.6616, 0.0000) ( -0.2651, 0.0000) ( -0.7014, 0.0000) 2 ( 0.7355, 0.0379) ( 0.3850, -0.0707) ( 0.5482, 0.0624) 3 ( 0.0507, -0.1317) ( 0.1724, 0.8642) ( -0.0173, -0.4509)

例題 3

こ 例題 6 × 4 行列 A ンク 一般化逆行列 計算します ンク 4 × 6 一般化逆行列

A+ がプ ン さ ます

#include <imsl.h>

#include <stdio.h>

int main() {

int m = 6, n = 4, rank;

float tol;

f_complex gen_inv[24], *s;

f_complex a[] = {{1.0, 2.0}, {3.0, 2.0}, {1.0,-4.0}, {1.0,0.0}, {3.0,-2.0}, {2.0,-4.0}, {1.0, 3.0}, {0.0,1.0}, {4.0, 3.0}, {-2.0,1.0}, {1.0, 4.0}, {0.0,0.0}, {2.0,-1.0}, {3.0, 0.0}, {3.0,-1.0}, {2.0,1.0}, {1.0,-5.0}, {2.0,-5.0}, {2.0, 2.0}, {1.0,3.1}, {1.0, 2.0}, {4.0,-2.0}, {2.0,-3.0}, {1.4,1.9}};

/* Factor a */

tol = 1.e-4;

s = imsl_c_lin_svd_gen (m, n, a, IMSL_RANK, tol, &rank,

IMSL_INVERSE_USER, gen_inv, IMSL_INV_COL_DIM, m,

0);

/* Print rank and generalized inverse matrix */

printf ("Rank = %2d", rank);

imsl_c_write_matrix ("Singular values", 1, n, s, 0);

imsl_c_write_matrix ("Generalized inverse", n, m, gen_inv, IMSL_A_COL_DIM, m,

0);

}

出力

Rank = 4

Singular values

1 2 3 ( 12.13, 0.00) ( 9.53, 0.00) ( 5.67, 0.00)

4 ( 1.74, 0.00)

Generalized inverse

1 2 3 1 ( 0.0266, 0.0164) ( -0.0185, 0.0453) ( 0.0720, 0.0700) 2 ( 0.0061, 0.0280) ( 0.0820, -0.1156) ( -0.0410, -0.0242) 3 ( -0.0019, -0.0572) ( 0.1174, 0.0812) ( 0.0499, 0.0463) 4 ( 0.0380, 0.0298) ( -0.0758, -0.2158) ( 0.0356, -0.0557)

4 5 6 1 ( -0.0220, -0.0428) ( -0.0003, -0.0709) ( 0.0254, 0.1050) 2 ( 0.0959, 0.0885) ( -0.0187, 0.0287) ( -0.0218, -0.1109) 3 ( -0.0234, 0.1033) ( -0.0769, 0.0103) ( 0.0810, -0.1074) 4 ( 0.2918, -0.0763) ( 0.0881, 0.2070) ( -0.1531, 0.0814)

警告 ー

IMSL_SLOWCONVERGENT_MATRIX 30回 反復 も 束しませ した

IMSL_UPDATE_PROCESS_FAILED 特異値 計算 た 分割統治法 更新が失敗した