|
DBDSQR/ZBDSQR (CLAPACK) |
DBDSQR/ZBDSQR
一般行列から縮約されたN行N列の(上三角もしくは下三角)準対角行列Bの特異値分解をする。
Bは
である。Sは非負対角要素(Bの特異値)で、QとPは直行行列である。
この関数は行列Sを計算する。オプションとして、入力時の実行列U、VT、Cに対して、
、
そして
を計算する。
上三角準対角行列Aとは、i=jもしくはi=j-1以外の要素がa(i,j)=0の行列である。
下三角準対角行列Aとは、i=jもしくはi=j+1以外の要素がa(i,j)=0の行列である。
<関数>
int dbdsqr_(char *uplo, integer *n, integer *ncvt, integer *nru, integer *ncc,
doublereal *d__, doublereal *e, doublereal *vt, integer *ldvt, doublereal *u,
integer *ldu, doublereal *c__, integer *ldc, doublereal *work, integer *info);
<引数>
char uplo - (input) 行列Bに上準対角行列をいれるか下準対角行列をいれるのかを決めるフラグ
='U' :行列[A]は上準対角行列とする。
='L' :行列[A]は下準対角行列とする。
long int n - (input) 正方行列[B]の次数。(n≧0) ここで、行列Bはn行n列である。
long int ncvt - (input) 行列[VT]の列数。ncvt≧0である。
long int nru - (input) 行列[U]の行数。nru≧0である。
long int ncc - (input) 行列[C]の列数。ncc≧0である。
double d - (input/output) 配列形式はd[n]。
(input) 準対角行列のn個の対角要素を入れる。
(output) info=0ならば、行列Bの特異値が降順で格納される。
double e - (input/output) 配列形式はe[n]。
(input) 配列eにはSVDが欲しい準対角行列の非対角要素を入れる。
(output)
info = 0: 通常終了時は、配列eのデータは破壊される。
info > 0: アルゴリズムが終了しない場合は、配列dとeは入力した配列と直交的に等しい準対角行列の対角要素と対角上要素が入る。
e(n-1)は作業スペースとして使われる。
double vt - (input/output) 配列形式はvt[ldvt×ncvt]。
(input) n行ncvt列の行列[VT]を入れる。[P]T*[VT]の計算を行いたいときに利用する。
(output) 配列vtは[P]T*[VT]で上書きされる。
ncvt=0ならば、配列vtは参照されない。
long int ldvt - (input) 配列vtの第一次元(のメモリ格納数)。ncvt>0ならば、ldvt≧max(1,n)とするが、通常はldvt=n。ncvt=0ならば、ldvt≧1とする。
double u - (input/output) 配列形式はu[ldu×n]。
(input) nru行n列の行列[U]を入れる。[U]*[Q]の計算を行いたいときに利用する。
(output) 配列uは[U]*[Q]で上書きされる。
nru=0ならば、配列uは参照されない。
long int ldu - (input) 配列uの第一次元(のメモリ格納数)。ldu≧max(1,nru)とする。通常はldu=nruである。
double c - (input/output) 配列形式はc[ldc×ncc]。
(input) nru行n列の行列[C]を入れる。[Q]T*[C]の計算を行いたいときに利用する。
(output) 配列cは[Q]T*[C]で上書きされる。
ncc=0ならば、配列cは参照されない。
long int ldc - (input) 配列cの第一次元(のメモリ格納数)。ncc>0ならば、ldc≧max(1,n) 通常はldc=nで良い。ncc=0ならば、ldc≧1にする。
double work - (workshop) 次元数4*nの配列。
long int info - (output)
info = 0: 正常終了
info < 0: info = -i ならば、i番目の引数の値が間違えていることを示す。
info > 0: アルゴリズムは収束しなかった。行列DとEは、(入力した行列Bに直行相似している)準対角行列の要素が格納される。
info=i ならば、行列Eのi個の要素は0に収束しなかった事を意味する。
の特異値を求める。
|
#include <stdio.h> #define N 4 double D[N]; double E[N]; double work[4*N]; int main(void) { long int i; char uplo = 'U'; long int n=N,ncvt=0,nru=0,ncc=0,ldvt,ldu=1,ldc=1,info; double *vt, *u, *c; D[0]=1.;D[1]=2.;D[2]=3.;D[3]=4.; E[0]=1.;E[1]=2.;E[2]=3.;E[3]=9999.; dbdsqr_(&uplo, &n, &ncvt, &nru, &ncc, D, E, vt, &ldvt, u, &ldu, c, &ldc, work, &info); for(i=0;i<N;++i) printf("%lf\n",D[i]); printf("info = %d\n",info); return 0; } |
Copyright (C) 2001 Keisuke ABE. All Rights Reserved.