Listing des Programms KOSKOBIL.C


/*      Programm koskobil.c                             */
/*      Bidirektionaler Assoziativspeicher nach         */
/*      Kosko mit Hebb-Lernregel zur Bilderassoziation  */
/*      Burkhard Lenze                                  */
/*      13.02.2009                                      */

/*      header-files                     */

#include <stdio.h>
#include <math.h>
#include "koskobil.h"

/*      globale Variablen                */

int x[100];                              /*  Eingabevektorfeld               */
int y[100];                              /*  Ausgabevektorfeld               */
int w[100][100];                         /*  Matrixfeld der Gewichte         */
int n;                                   /*  Anzahl der Eingabe-Neuronen     */
int m;                                   /*  Anzahl der Ausgabe-Neuronen     */
int zeile_x,spalte_x;                    /*  Zeilen/Spalten des Eingabebilds */
int zeile_y,spalte_y;                    /*  Zeilen/Spalten des Ausgabebilds */
char com;                                /*  Menuparameter                   */

/*      Funktionen                       */

void lese_x(void) 
    {
    int i,r,c,nn;
    char k;
    FILE *f;
    char dat[20];
    printf("\nWie lautet die Eingabe-Bilddatei ? \n");
    scanf("%s",&dat);
    f=fopen(dat,"r");
    fscanf(f,"%d",&nn);
    if (nn==spalte_x) 
       {
       fscanf(f,"%d",&nn);
       if (nn==zeile_x)
          {      
          i=1; 
          for (r=1;r<=zeile_x+1;r++)
              {
              for (c=1;c<=spalte_x+1;c++) 
                  {
                  fscanf(f,"%c",&k);
                  printf("%c",k);
                  if (k=='.') {x[i]=-1;}
                  if (k=='X') {x[i]=1;}
                  if (k=='\n') {i=i-1;}
                  i=i+1;
                  }
              }
          }
       else
          {
          printf("\nFehler! Zeilen in Datei %2d statt %2d \n",nn,zeile_x);
          }
       } 
    else
       {
       printf("\nFehler! Spalten in Datei %2d statt %2d \n",nn,spalte_x);
       }
    fclose(f);
    }

void lese_y(void) 
    {
    int i,r,c,nn;
    char k;
    FILE *f;
    char dat[20];
    printf("\nWie lautet die Ausgabe-Bilddatei ? \n");
    scanf("%s",&dat);
    f=fopen(dat,"r");
    fscanf(f,"%d",&nn);
    if (nn==spalte_y) 
       {
       fscanf(f,"%d",&nn);
       if (nn==zeile_y)
          {      
          i=1; 
          for (r=1;r<=zeile_y+1;r++)
              {
              for (c=1;c<=spalte_y+1;c++) 
                  {
                  fscanf(f,"%c",&k);
                  printf("%c",k);
                  if (k=='.') {y[i]=-1;}
                  if (k=='X') {y[i]=1;}
                  if (k=='\n') {i=i-1;}
                  i=i+1;
                  }
              }
          }
       else
          {
          printf("\nFehler! Zeilen in Datei %2d statt %2d \n",nn,zeile_y);
          }
       } 
    else
       {
       printf("\nFehler! Spalten in Datei %2d statt %2d \n",nn,spalte_y);
       }
    fclose(f);
    }

int T(int A)
    {
    if (A>0) return(1);
    if (A<0) return(-1);
    } 

void lernen(void) 
    {
    int i,j;
    lese_x();
    lese_y();
    for (j=1;j<=m;j++)
         {
         for (i=1;i<=n;i++) {w[i][j]=w[i][j]+(x[i]*y[j]);}
         }
    }

void zeichne_x(void) 
    {
    int i,r,c;
    i=1;
    printf("\n");
    for (r=1;r<=zeile_x;r++) 
        {
        for (c=1;c<=spalte_x;c++) 
            {
            if (x[i]>0)
               {
               printf("X");
               }
            else
               {
               printf(".");
               }
            i=i+1; 
            }
        printf("\n");
        }
    }

void zeichne_y(void) 
    {
    int j,r,c;
    j=1;
    printf("\n");
    for (r=1;r<=zeile_y;r++) 
        {
        for (c=1;c<=spalte_y;c++) 
            {
            if (y[j]>0)
               {
               printf("X");
               }
            else
               {
               printf(".");
               }
            j=j+1; 
            }
        printf("\n");
        }
    }

void ausfuehren(void) 
    {
    int i,j,u,A,C;
    lese_x();
    u=-1;
    for (j=1;j<=m;j++) {y[j]=-1;}
    do
      {
      u=u+1;    
      C=0;
      if (u==0) C=1;
      zeichne_x();
      for (j=1;j<=m;j++)
          {
          A=0;
          for (i=1;i<=n;i++) {A=A+(w[i][j]*x[i]);}
          if (A!=0)
             {
             if (T(A)!=y[j]) C=1;       
             y[j]=T(A);
             }
          }
      for (i=1;i<=n;i++)
          {
          A=0;
          for (j=1;j<=m;j++) {A=A+(w[i][j]*y[j]);}
          if (A!=0) x[i]=T(A);
          }
      zeichne_y();
      }
    while (C!=0);
    } 

void veraendern(void) 
    {
    int i,j;
    printf("\n");
    printf("Wieviele Zeilen im Eingabebild ? ");
    scanf("%d",&zeile_x);
    printf("Wieviele Spalten im Eingabebild ? ");
    scanf("%d",&spalte_x);
    printf("\n");
    printf("Wieviele Zeilen im Ausgabebild ? ");
    scanf("%d",&zeile_y);
    printf("Wieviele Spalten im Ausgabebild ? ");
    scanf("%d",&spalte_y);
    n=zeile_x*spalte_x;
    m=zeile_y*spalte_y;
    if (n>99 || m>99)
       {
       printf("\n Bilder zu gross! Ggf. globale Felder vergroessern! \n ");
       }
    if (n<100 && m<100)
       {
       for (i=1;i<=n;i++) {x[i]=0;}
       for (j=1;j<=m;j++) {y[j]=0;}
       for (i=1;i<=n;i++) 
           {
           for (j=1;j<=m;j++) {w[i][j]=0;}
           }    
       }
    }

void zeigen(void) 
    {
    int i,j;
    printf("\nDie Gewichte w[i][j] lauten: \n");
    for (j=1;j<=m;j++) 
        {
        for (i=1;i<=n;i++) 
            {
            printf("%2d ",w[i][j]);
            }
            printf("\n");
        }
    }

void speichern(void) 
    {
    int i,j;
    FILE *f;
    char dat[20];
    printf("\nWie lautet die Datei mit den Gewichten ? ");
    scanf("%s",&dat);
    f=fopen(dat,"w");
    fprintf(f,"%d\n",n);
    fprintf(f,"%d\n",m);
    for (j=1;j<=m;j++)
        {
        for (i=1;i<=n;i++) {fprintf(f,"%d\n",w[i][j]);}
        }
    fclose(f);
    }

void einlesen(void) 
    {
    int i,j,r;
    FILE *f;
    char dat[20];
    printf("\nWie lautet die Datei mit den Gewichten ? ");
    scanf("%s",&dat);
    f=fopen(dat,"r");
    fscanf(f,"%d",&r);
    if (r==n) 
       {
       fscanf(f,"%d",&r);
       if (r==m)
          {
          for (j=1;j<=m;j++)
              {
              for (i=1;i<=n;i++) {fscanf(f,"%d",&w[i][j]);}
              }
          }
       else
          {
          printf("\nFehler! m ist in Datei %2d statt %2d \n",r,m);
          }
       } 
    else
       {
       printf("\nFehler! n ist in Datei %2d statt %2d \n",r,n);
       }
    fclose(f);
    }

/*      Hauptprogramm                    */

int main(void)
    {
    veraendern();
    do 
      {
      printf("\nlernen ausfuehren zeigen veraendern speichern einlesen beenden:\n");
      fflush(stdin);
      scanf("%c",&com);        
      switch(com)
            {
            case 'l': lernen(); break;
            case 'a': ausfuehren(); break;
            case 'z': zeigen(); break;
            case 'v': veraendern(); break;
            case 's': speichern(); break;
            case 'e': einlesen(); break;
            default:  break;
            } 
      }
    while (com!='b'); 
    return(0);
    }






Burkhard Lenze
Im Februar 2009