|
DGETRI/ZGETRI (CLAPACK) |
DGETRI/ZGETRI
DGETRF/ZGETRFで計算したLU分解後の行列を利用して、逆行列[A]-1を計算する。
<関数>
int dgetri_(integer *n, doublereal *a, integer *lda, integer *ipiv, doublereal *work, integer *lwork, integer *info);
<引数>
long int n - (input) 行列[A]の行数。(n≧0)
double a - (input/output) 配列次元数は[lda×n]。
(input)DGETRIでLU分解されたn行n列の行列[A]。
(output)行列[A]の逆行列。
long int lda - (input) 行列Aの第1次元(のメモリ格納数)。lda≧max(1,n) つまり、1〜nの中で一番大きい数よりも、ldaが大きくなければならない。
通常はlda=nで良い。
long int ipiv - (output) 次元数nの配列。軸選択用添え字。1 ≦ i ≦ nなる行列Aのi行は、IPIV[i]と交換してある。
double work - (working/otput)次元数ldworkの配列。出力時にinfo=0のとき、work[0]には最適なlworkが入る。
long int lwork - (input)配列workの次元数。lwork≧max(1,n)。
long int info - (output)
info = 0: 正常終了
info < 0: info = -i ならば、i番目の引数の値が間違えていることを示す。
info > 0: info = i ならば、U[i][i]は0である。行列は特異であり、逆行列は計算できない。
の逆行列を求める。(答え:
)
|
#include <stdio.h> #define M 3 #define N 3 double A[M*N]; int main(void) { static int i; static long int m=M,n=N,lda=M,info,piv[N],lwork=N; static double work[N]; A[0]=1.;A[1]=2.;A[2]=3.; A[3]=4.;A[4]=9.;A[5]=14.; A[6]=6.;A[7]=14.;A[8]=23.; dgetrf_( &m, &n, A, &lda, piv, &info); dgetri_(&n, A, &lda, piv, work, &lwork, &info); for(i=0;i<(N*M);++i) printf("%lf\n",A[i]); return 0; } |
Copyright (C) 2001 Keisuke ABE. All Rights Reserved.