/* 結合荷重の積を算出してpgmで書き出すプログラム */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <math.h> #include "params.h" #include "image_rw.h" #define Max 50 #define fsig( in ) ( 1 / ( 1 + exp( -( in ))) ) /* シグモイド関数 */ #define FRopen( fp , fname ) if( NULL == ((fp) = fopen( fname , "r" ))){ perror( fname ); exit( 1 ); } int Flag_sig = 1; int Xsize = 1; int Ysize = 1; int Msize = 1; int Tsize = 2; int Filenumber = 0; double tmp_im[Max][Max]; double tmp_mo[Max][Max]; double indata[Max][Max][Max]; /* 配列は[X軸][Y軸][中間層番号] */ int imagedata[Max][Max][Max]; Image image_out[Max]; void set_indata(); void set_standard(); void make_image(); main( int argc , char *argv[] ){ int k; char finame1[Max * Max],finame2[Max * Max]; char ftname1[2 * Max],ftname2[2* Max]; char *foname[Max]; char *c_ptr; if( argc != 3 ){ printf( "Usage : weight Midunit Outunit Filenumber \n" ); exit(1); } Msize = atoi( argv[1] ); Xsize = Ysize = atoi( argv[2] ) + 2; sprintf( finame1 , "Dataweight/mn_weight_verM%d_N%d.dat" , Msize , Xsize - 2 ); sprintf( ftname1 , "Dataweight/mt_weight_verM%d_N%d.dat" , Msize , Xsize - 2 ); sprintf( finame2 , "Dataweight/nm_weight_verM%d_N%d.dat" , Msize , Xsize - 2 ); sprintf( ftname2 , "Dataweight/tm_weight_verM%d_N%d.dat" , Msize , Xsize - 2 ); set_indata( finame1 , ftname1 , finame2 , ftname2 ); set_standard(); make_image(); for( k = 0 ; k < Msize ; k++ ){ c_ptr = malloc( 40 + 1 ); foname[k] = c_ptr; if( k <= 9 ){ sprintf( foname[k] , "Weightmulti/multiweight_verM%d_N%d_D0%d.pgm" , Msize , Xsize - 2 , k ); } else { sprintf( foname[k] , "Weightmulti/multiweight_verM%d_N%d_D%d.pgm" , Msize , Xsize - 2 , k ); } printf( "create -> %s\n" , foname[k] ); image_write( image_out[k] , foname[k] ); } } void set_indata( char *fname1 , char *fname2 , char *fname3 , char *fname4 ){ FILE *fp1,*fp2,*fp3,*fp4; int i,j,k; FRopen( fp1 , fname1 ); FRopen( fp2 , fname2 ); FRopen( fp3 , fname3 ); FRopen( fp4 , fname4 ); for( j = 0 ; j < Msize ; j++ ){ for( i = 0 ; i < Tsize ; i++ ){ fscanf( fp4 , "%lf " , &tmp_im[i][j] ); fscanf( fp2 , "%lf " , &tmp_mo[i][j] ); } for( i = Tsize ; i < Xsize ; i++ ){ fscanf( fp3 , "%lf " , &tmp_im[i][j] ); fscanf( fp1 , "%lf " , &tmp_mo[i][j] ); } } fclose( fp1 ); fclose( fp2 ); fclose( fp3 ); fclose( fp4 ); for( k = 0 ; k < Msize ; k++ ){ for( j = 0 ; j < Ysize ; j++ ){ for( i = 0 ; i < Xsize ; i++ ){ indata[i][j][k] = tmp_im[i][k] * tmp_mo[j][k]; } } } } void set_standard(){ int i,j,k; double max,min; for( k = 0 ; k < Msize ; k++ ){ max = min = indata[0][0][k]; for( j = 0 ; j < Ysize ; j++ ){ for( i = 0 ; i < Xsize ; i++ ){ if( indata[i][j][k] >= max ) max = indata[i][j][k]; if( indata[i][j][k] <= min ) min = indata[i][j][k]; } } for( j = 0 ; j < Ysize ; j++ ){ for( i = 0 ; i < Xsize ; i++ ){ if( Flag_sig != 0 ){ indata[i][j][k] = fsig( indata[i][j][k] ) * 255; } else { indata[i][j][k] = ( indata[i][j][k] - min ) / ( max - min ) * 255; } imagedata[i][j][k] = (int)indata[i][j][k]; } } } } void make_image(){ int i,j,k; for( k = 0 ; k < Msize ; k++ ){ image_out[k] = mkimage( Xsize , Ysize ); for( j = 0 ; j < Ysize ; j++ ){ for( i = 0 ; i < Xsize ; i++ ){ pixel( image_out[k] , i , j ) = (unsigned char)imagedata[i][j][k]; } } } }