3次元マトリックスの確保 C言語
C言語では、多次元配列は無いとかポインタがどうとか、ややこしいー話がいっぱい。
- http://www.nurs.or.jp/~sug/soft/tora/tora10.htm
- http://d.hatena.ne.jp/arakik10/20070614/p1
- http://www.aso.ecei.tohoku.ac.jp/~shun/multi_dim.html
私がやりたいのは、配列のインデックスを動的にフリーに指定すること。
ちょうど、昔のnumerical recipes in Cに出てくる2次元配列の動的確保を3次元配列でやりたい。。ということであった。
これまた悪戦苦闘。結局下記のプログラムでうまくいった。
#define HUP 1 //***************************************************** double ***dmatrix_3d(long row1, long row2, long col1, long col2, long dep1, long dep2){ long i,j, nrow=row2-row1+1, ncol=col2-col1+1, ndep=dep2-dep1+1; double ***m; m=(double ***) malloc((size_t)((nrow+HUP)*sizeof(double**))); m += HUP; m -= row1; m[row1]=(double **) malloc((size_t)((ncol*nrow+HUP)*sizeof(double*))); m[row1] += HUP; m[row1] -= col1; for(i=row1+1;i<=row2;i++){ m[i]=m[i-1]+ncol; } m[row1][col1]=(double *)malloc((size_t)((ndep*ncol*nrow+HUP)*sizeof(double))); m[row1][col1] += HUP; m[row1][col1] -= dep1; j=col1; for(i=row1+1;i<=row2;i++){ m[i][j]=m[i-1][j]+ncol*ndep; } for(i=row1;i<=row2;i++){ for(j=col1+1;j<=col2;j++){ m[i][j]=m[i][j-1]+ndep; } } return m; } //***************************************************** void free_3d_matrix(double ***m,long row1, long row2, long col1, long col2, long dep1, long dep2){ free( (char*)(m[row1][col1]+dep1-HUP) ); free( (char*)(m[row1]+col1-HUP) ); free( (char*)(m+row1-HUP) ); } //***************************************************** void main(void){ double ***mat_a; int i,j,k; mat_a=d_matrix3d(1,3,1,3,1,3); for(i=1;i<=3;i++){ for(j=1;j<=3;j++){ for(k=1;k<=3;k++){ mat_a[i][j][k]=(double)(i+j+k); } } } for(i=1;i<=3;i++){ for(j=1;j<=3;j++){ for(k=1;k<=3;k++){ printf("%f\t", mat_a[i][j][k]; } printf("\n"); } printf("\n"); } free_3d_matrix(mat_a,1,3,1,3,1,3);