function [Unew,Vnew, Uschleife, Vschleife]=MlpEpoch2(x,z,U,V, Uinput, Vinput, alp,eta)

%   Es wird eine Lernepoche an den 1D-Daten x und z 
%   durchgeführt

% eta:   Paramter für die Lernschrittweite
% x:     Spaltenvektor der Inputdaten
% y:     Spaltenvektor der Outputdaten

% U:     Gewichtsvektor (Px1) mit einem 
%        Neuron von versteckter Schicht
%        zur Ausgabeschicht

% V:     Gewichtsmatrix (Px2) mit einem
%        Neuron von versteckter Schicht
%        zur Ausgabeschicht

% Unew:  Enthält die neue Gewichtsmatrix nach 
%        einer Lernepoche

% Vnew:  Enthält die neue Gewichtsmatrix nach
%        einer Lernepoche


M = max(size(x));               % Anzahl der maximalen Datenpunkte
[P,dummy] = size(V);            % Größe des Netzes
                                

Vschleife = zeros(P,2);         % Initialisieren einer Input-Matrix für
Uschleife = zeros(P+1,1)';      % die Epochen-Schleife um Fehler aufzusummieren
                                % wichtig für Bacht-Modus!

%Epochenschleife 
for m=1:M
   
    
    b = V*[1;x(m)];              
    y = g(b);                   % b wird in die Transferfunktion gegeben
    a = U*[1;y];                 
    z_dach = a;                 % entspricht U * y wird drüber als a definiert
                                % Unterschied zu Praktikum: a wird nicht in
                                % die Transferfunktion gegeben
                                
   
    % Fehlerberechnung
    % Input wird durch Netz propagiert. Output wird mit
    % gewünschtem Output verglichen. Differenz = Fehler des Netzes
    % Fehler wird zurückpropagiert (-> Backpropagation)
    % -> da Ableitung von z_dach = 1 
    % -> kann z_dach bei delta_z vernachlässigt werden 
    delta_z = 2 * (z(m) - z_dach);
    delta_y = delta_z * U(2:P+1)' .* y .* (1 - y);
   
    
    % Backpropagation
    % Beinhaltet das "Aufsummieren" der Fehler
    Uschleife = Uschleife + eta .* delta_z * [1,y']; 
    Vschleife = Vschleife + eta .* delta_y * [1,x(m)];
   
    
end;

    % Update der Gewichtsparameter
    %
    %      Batch-Modus
    %    
    %     delta_w = - eta * sum((y(m) - y_dach(x(m)))*x(m));
    %     sum((y(m) - y_dach(x(m)))*x(m)): entspricht den 
    %     delta_z_summe und delta_y_summe Werten

    % Momentum-Term alp verbessert Performance: es ist schneller
    % da es das oszillieren der Gewichtstrajektoren verhindert.
    % ausserdem wird das Entweichen der lokalen Minima verhindert
    % alp bestimmt welche Seite überwiegt
    % wenn alp klein (< 0.5), dann jetziges U
    % wenn alp groß  (> 0.5), dann altes U
    
    Uschleife = (1-alp) *  Uschleife + (alp * (Uschleife + Uinput)); 
    Vschleife = (1-alp) *  Vschleife + (alp * (Vschleife + Vinput));
    
    
    % Aktualisieren von Unew und Vnew für learnMlp.m
    Unew = U + Uschleife;
    Vnew = V + Vschleife;




