|
従来型一般行列格納形式 (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.