正規化

 ファイルから読み込んだデータを[0:1]の値に正規化して表示するプログラムです。

正規化例題list_27.c)
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#define MAXV 1.0
///////////////////////////////////////////////////////
void normalize_value(double maxv,int valn,int linen,double datas[256][25]);
///////////////////////////////////////////////////////

int main(int argc,char* argv[])
{
    int i,ii,valn,linen,temp;
    double datas[256][25];
    FILE *fp;
    char fbuf[255];
    char seps[]=" ",*token;

    if(argc <= 1){
        printf("usage:%s datafile\n",argv[0]);
        return 0;
    } else {
        fp = fopen(argv[1],"r");
    }
    memset(datas,0,sizeof(double)*(25*256));
    
    linen = 0;
    while(fgets(fbuf,255,fp)){
        valn=0;
        token = strtok( fbuf, seps );
        while( token != NULL ){ /* buf にトークンがなくなるまで繰り返す */
            sscanf(token,"%d",&temp);
            datas[linen][valn++] = temp;
            /* 次のトークンを取得 */
            token = strtok( NULL, seps );
        }
        linen ++;
    }
    
    normalize_value(MAXV,valn,linen,datas);
    
    /* 表示 */
    for(i=0;i<linen;i++){
        printf("%d ",i+1);
        for(ii=0;ii<valn;ii++){
            printf("%lf ",datas[i][ii]);
        }
        printf("\n");
    }
}

/* 正規化 */
void normalize_value(double maxv,int valn,int linen,double datas[256][25])
{
    int i,ii;
    double max[25],min[25];
    for(ii=0;ii<25;ii++){
        max[ii] = -1e32; min[ii] = 1e32;
    }
    for(i=0;i<linen;i++){
        for(ii=0;ii<valn;ii++){
            if(datas[i][ii] - max[ii] > 0) max[ii] = datas[i][ii];
            if(datas[i][ii] - min[ii] < 0) min[ii] = datas[i][ii];
        }
    }
    /* 正規化 */
    for(i=0;i<linen;i++){
        for(ii=0;ii<valn;ii++){
            datas[i][ii] = (maxv)*(datas[i][ii]-min[ii]) /
                fabs(max[ii]-min[ii]);
        }
    }
}
実行結果
Gami[1393]% cat dataf.txt
2409 483 349 45503 7626 1032185
2651 641 363 45534 8123 1082795
4193 1800 382 41428 11554 1435806
4033 3564 355 41408 13074 1590777
5307 10008 343 41070 16521 2027196
Gami[1394]% list_27.exe dataf.txt
1 0.000000 0.000000 0.153846 0.993056 0.000000 0.000000
2 0.083506 0.016588 0.512821 1.000000 0.055874 0.050864
3 0.615597 0.138268 1.000000 0.080197 0.441596 0.405645
4 0.560386 0.323465 0.307692 0.075717 0.612479 0.561393
5 1.000000 1.000000 0.000000 0.000000 1.000000 1.000000
Gami[1395]%
inserted by FC2 system