/* 結合荷重の積を算出して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];
}
}
}
}