% Vorlesung Neuronale Netze SS 2001, Uebung 1, Aufgabe 3

% Interne Verknüpfungsmatrix
% Falls eine exitatorische Verbindung von Neuron a nach Neuron b
% existiert, dann ist IVM(a,b) gleich 1. Wenn eine inhibitorische
% Verbindung von Neuron a nach Neuron b existiert, dann ist IVM(a,b)
% gleich -100. Sonst ist IVM(a,b) gleich 0. 
% 100 wurde hier gewäht, um eine absolute Hemmung zu simulieren.
% Das geht hier, denn die exitatorischen Eingaben sind in unserem
% Beispiel nie größer als 100.

IVM = [ 1 1 ; -100 -100 ];          % Interne Verknüpfungsmatrix

% Eingabe Verknüpfungsmatrix
% Etwa wie bei der Internen Verknüpfungsmatrix. Nur hier EVM(a,b) gleich
% 1, wenn eine exitatorische Verknüpfung von der Eingabe a zum Neuron b
% existiert.

EVM = [ 1 1 ];                      % Eingabe Verknüpfungsmatrix

% Zustrandsvektor
% ZV(a) gibt den Zustand des Neurons a zur aktuellen Zeit an. Der
% Zustandsvektor muß zur Zeit 0 initialisiert werden. 

ZV = [ 0  0];                       % Zustrands(zeilen)vektor 

% Schwellwertvektor
% SV(a) gibt Schwellwert von Neuron a an.

SV = [1  2];                        % Schwellwert(zeilen)vektor

% Eingabematrix
% Dies geht über die Zeit. Zu einem Zeitpunkt t gibt es einen 
% Eingabevektor (t-te Spalte der Matrix).
% Wie haben nur eine Eingabe, deshalb ist es kein richtiger Vektor und 
% keine richtige Matrix.

EM = [ 0 0 1 1 0 0 1 1 1 1 1 0 ];   % Eingabematrix (Zeit in Spalten!)

% Das waren die Initialisierungen. Jetzt geht es in die Zeitschleife:

% Die Zeit. Wir fangen bei 1 an zu wählen, wie auch bei den Matrizen. 
% Die größte Zeit berechnen wir aus den Eingabewerten.
% In Matlab geht das natürlich auch alles implizit über die Matrix und 
% ohne diese for-Schleife, aber so finde ich es anschaulicher.

maxtime=size(EM,2);                 % Anzahl der Zeitschritte holen.

for t = 1:maxtime; 

  EV = EM(:,t);                     % Eingabevektor zur Zeit t holen.

  ERG = EV * EVM + ZV * IVM - SV;   % Erregung der Neuronen berechnen.

  % Wenn das Ergebnis größer oder gleich 0 ist und nicht, dann ist
  % der Zustand des Neurons erregt. Das ist dann auch der neue 
  % Zustandsvektor.
  % Evtl. würde hier eine if-Abfrage verständlicher sein.

  ZV = zeros(size(ZV));             % Neuen Zustand initialisieren ...
  ZV(sign(ERG)>=0)=1;               % ... und setzen.

  % Zustand des zweiten Neurons als Output mit Zeit und Eingabe ausgeben.

  disp(sprintf('Zeit %i: Eingabe %i, Ausgabe %i',t,EV,ZV(2)));

end;


