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

 従来型一般行列格納形式 (CLAPACK)

従来型一般行列格納形式

C言語で一般的に一般行列[A]は2次元配列に格納するが、CLAPACK形式に直すために1次元配列に移し替える。

<関数>(例)

void mat2vec(long int *nrl, long int *nrh, long int *ncl, long int *nch, double **matrixA, double *a);

<引数>

long int nrl - (input) 一般行列[A]の行の最初の番号。(nrl≧0) ここで、行列Aは(nrh-nrh+1)行(nch-ncl+1)列。

long int nrh - (input) 一般行列[A]の行の最後の番号。(nrh≧0) ここで、行列Aは(nrh-nrh+1)行(nch-ncl+1)列。

long int ncl - (input) 一般行列[A]の列の最初の番号。(ncl≧0) ここで、行列Aは(nrh-nrh+1)行(nch-ncl+1)列。

long int nch - (input) 一般行列[A]の行の最後の番号。(nch≧0) ここで、行列Aは(nrh-nrh+1)行(nch-ncl+1)列。

double matrixA  - (input) (nrh-nrl+1)行(nch-ncl+1)列の行列[A]。ダブルポインタであることに注意。

double a - (output) 行列が格納される1次元配列。配列の大きさはa[(nrh-nrl+1)×(nch-ncl+1)]。

NUMERICAL RECIPIESを利用して確保した2次元配列を、1次元配列に格納するルーチン

/* prototype */

void mat2vec(long int *nrl, long int *nrh, long int *ncl, long int *nch, double **matrixA, double *a);

/* function */

void mat2vec(long int *nrl, long int *nrh, long int *ncl, long int *nch, double **matrixA, double *a)

{

        static long int i,j;

        for( i = (*nrl); i <= (*nrh); i++){

                for( j = (*ncl); j <= (*nch); j++){

                        a[(i-(*nrl)) * ((*nch)-(*ncl)+1) + (j -(*ncl))] = matrixA[j][i];

                }

        }

}

NUMERICAL RECIPIESのルーチンで2次元配列に格納された行列を、1次元配列a[N*N]に入れなおす。

#include <stdio.h>

#include "nrutil.h"

#define N 3

double **matA;

double A[N*N];

int main(void)

{

  static long int i;

  long int nrl=0, nrh=N-1, ncl=0, nch=N-1;

  double **matA;

  matA = dmatrix(nrl,nrh,ncl,nch); /* Numerical Recipiesで与えられるライブラリ関数(mat[nrh-nrl+1][nch-ncl+]の大きさのメモリ領域を確保)*/

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

  matA[1][0]=4.;matA[1][1]=5.;matA[1][2]=6.;

  matA[2][0]=7.;matA[2][1]=8.;matA[2][2]=9.;

  mat2vec(&nrl, &nrh, &ncl, &nch, matA, A);

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

  return 0;

}


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