ホーム > 数値計算ソフトウェア > ライブラリ > LAPACK > CLAPACK > ルーチンの仕様 >

 DGETRF/ZGETRF (CLAPACK)

DGETRF/ZGETRF

m行n列の一般行列[A]を、LU分解する。

LU分解後行列[A]は [A]=[P]*[L]*[U]の形体をとっている。

[U]に上三角行列を、[L]に下三角行列を、[P]に置換行列を表す。

ただし、m<nのとき[U]は上台形行列、m>nのとき[P]は下台形行列を表す。

<関数>

int dgetrf_( integer *m, integer *n, doublereal *a, integer *lda, integer *ipiv, integer *info);

<引数>

long int m - (input) 行列[A]の列数。(m≧0)

long int n - (input) 行列[A]の行数。(n≧0)

double a - (input/output) 配列形式はa[lda×n]。

               (input)LU分解をするm行n列の行列[A]。

               (output)LU分解後の行列因子[L]と[U]。ただし、行列[L]の単位対角要素は格納されない。

               A=[P]*[L]*[U]であり、[P]は行と列を入れ替える操作に対応し、置換行列と呼ばれ、0か1が格納される。

long int lda - (input) 行列Aの第一次元(のメモリ格納数)。lda≧max(1,m) つまり、1〜mの中で一番大きい数よりも、ldaが大きくなければならない。

                  通常はlda=mで良い。

long int ipiv - (output) 次元数min(m,n)の配列。軸選択用添え字。つまり、ipivはmとnのうちで小さい方の数だけメモリを確保する必要がある。

                  1 <= i <= min(m,n)なる行列Aのi行は、IPIV[i]と交換された。

long int info - (output)

             info = 0: 正常終了

             info < 0: info = -i ならば、i番目の引数の値が間違えていることを示す。

             info > 0: info = -i ならば、U[i][i]は0である。LU分解は行われたが、上三角因子Uが特異になっており、

                         この結果を利用して方程式を解くとゼロ割が発生する。

を解く。

#include <stdio.h>

#define M 4

#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];

  A[0]=1.;A[1]=3.;A[2]=1.; A[3]=1.;

  A[4]=1.;A[5]=1.;A[6]=2.;A[7]=4.;

  A[8]=1.;A[9]=3.;A[10]=-5.;A[11]=3.;

  dgetrf_( &m, &n, A, &lda, piv, &info);

  for(i=0;i<(N*M);++i) printf("%lf\n",A[i]);

  return 0;

}


Copyright (C) 2001 Keisuke ABE. All Rights Reserved.