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