% ------------------------------------------------
% Maturarbeit 2019 von Simon Rohrbach
% ------------------------------------------------


clc

minFrequenz = 49
maxFrequenz = 51
anzSpalten = 10
anzZeilen = 10
anzahlDurchlaeufe = 12
anzahlError = 5;


B = Create_Matrix(minFrequenz,maxFrequenz,anzSpalten,anzZeilen);
for (i = 1:anzahlDurchlaeufe)
  for (zeile = (1:anzZeilen))
    for (spalte = (1:anzSpalten))
      
      oben = 0;
      rechtsoben = 0;
      rechts = 0;
      rechtsunten = 0;
      unten = 0;
      linksunten = 0;
      links = 0;
      linksoben = 0;
      Aktuelle_Zelle = B(zeile,spalte);  % Wert der Zelle
      Zellentyp = 0;
      
      % ----------------------------------------------------------------------------------------------------------- %
      % Erkennen, welche Zelle wir gerade betrachten
      % ----------------------------------------------------------------------------------------------------------- %
      
      
      % ----------------------------------------------------------------------------------------------------------- %
      %Eckzellen
      % ----------------------------------------------------------------------------------------------------------- %
      % Zelle Links oben, Typ = 1
      if ((zeile == 1) && (spalte == 1)) 
        Zellentyp = 1;
        rechts = B(zeile,spalte+1);
        rechtsunten = B(zeile+1,spalte+1);
        unten = B(zeile+1,spalte);
      end
      
      % Zelle Rechts oben, Typ = 1
      if ((zeile == 1) && (spalte == anzSpalten))
        Zellentyp = 1;
        unten = B(zeile+1,spalte);
        linksunten = B(zeile+1,spalte-1);
        links = B(zeile,spalte-1);
      end
      
      % Zelle Rechts unten, Typ = 1
      if ((zeile == anzZeilen) && (spalte == anzSpalten))
        Zellentyp = 1;
        oben = B(zeile-1,spalte);
        linksoben = B(zeile-1,spalte-1);
        links = B(zeile,spalte-1);
      end
      
      % Zelle Links unten, Typ = 1
      if ((zeile == anzZeilen) && (spalte == 1))
        Zellentyp = 1;
        oben = B(zeile-1,spalte);
        rechtsoben = B(zeile-1,spalte+1);
        rechts = B(zeile,spalte+1);
      end
      % ----------------------------------------------------------------------------------------------------------- %
      
      
      
      
      % ----------------------------------------------------------------------------------------------------------- %
      %Randzellen
      % ----------------------------------------------------------------------------------------------------------- %
      % Zelle oben, Typ = 2
      if ((zeile == 1) && ((spalte > 1) && ( spalte < anzSpalten)))
        Zellentyp = 2;
        links = B(zeile,spalte-1);
        linksunten = B(zeile+1,spalte-1);
        unten = B(zeile+1,spalte);
        rechtsunten = B(zeile+1,spalte+1);
        rechts = B(zeile,spalte+1);
      end
      
      % Zelle rechts, Typ = 2
      if (((zeile > 1) && (zeile < anzZeilen)) && (spalte == anzSpalten))
        Zellentyp = 2;
        oben =  B(zeile-1,spalte);
        linksoben = B(zeile-1,spalte-1);
        links = B(zeile,spalte-1);
        linksunten = B(zeile+1,spalte-1);
        unten = B(zeile+1,spalte);
      end
      
      % Zelle unten, Typ = 2
      if (((zeile == anzZeilen)&&(spalte > 1) && (spalte < anzSpalten)))
        Zellentyp = 2;
        links = B(zeile,spalte-1);
        linksoben = B(zeile-1,spalte-1);
        oben =  B(zeile-1,spalte);
        rechtsoben = B(zeile-1,spalte+1);
        rechts = B(zeile,spalte+1);
      end
      
      % Zelle links, Typ = 2
      if (((zeile > 1) && (zeile < anzZeilen)) && (spalte == 1))
        Zellentyp = 2;
        oben =  B(zeile-1,spalte);
        rechtsoben = B(zeile-1,spalte+1);
        rechts = B(zeile,spalte+1);
        rechtsunten = B(zeile+1,spalte+1);
        unten = B(zeile+1,spalte);
      end
      
      % Alle anderen Zellen, Typ = 3
      if (((zeile > 1) && (zeile < anzZeilen)) && (spalte > 1) && ((spalte < anzSpalten)))
        Zellentyp = 3;
        oben =  B(zeile-1,spalte);
        rechtsoben = B(zeile-1,spalte+1);
        rechts = B(zeile,spalte+1);
        rechtsunten = B(zeile+1,spalte+1);
        unten = B(zeile+1,spalte);
        linksunten = B(zeile+1,spalte-1);
        links = B(zeile,spalte-1);
        linksoben = B(zeile-1,spalte-1);
      end
      
      
      %disp ("------------------------------------------------")
      %disp ("zeile:"), disp (zeile),   disp ("spalte:"),  disp (spalte)
      %disp ("oben:"), disp (oben);    disp ("rechtsoben:"), disp (rechtsoben)
      %disp ("rechts:"), disp (rechts);    disp ("rechtsunten:"), disp (rechtsunten)
      %disp ("unten"), disp (unten); disp ("linksunten:"), disp (linksunten)
      %disp ("links"), disp (links); disp ("linksoben:"), disp (linksoben)
      %disp ("-------------------------------------------------")
      
      kleinMatrix = [linksoben,oben,rechtsoben;links,B(zeile,spalte),rechts;linksunten,unten,rechtsunten];  % 3x3 Matrix
      
      
      % ----------------------------------------------------------------------------------------------------------- %
      % Mittelwert bilden
      % ----------------------------------------------------------------------------------------------------------- %
      
      % Eckzelle = Typ 1
      if Zellentyp == 1
        % Berechnung des Durchschnittwertes
        durchschnitt=((linksoben + oben + rechtsoben + links + (B(zeile,spalte)) + rechts + linksunten + unten + rechtsunten)/4);
        
        % Berechnete Werte je nach Position in die Matrix zurückschreiben
        if linksoben > 0.00
          linksoben = durchschnitt;
          B(zeile-1,spalte-1) = durchschnitt;
        end
        if oben > 0.00
          oben = durchschnitt;
          B(zeile-1,spalte) = durchschnitt;
        end
        if rechtsoben > 0.00
          rechtsoben = durchschnitt;
          B(zeile-1,spalte+1) = durchschnitt;
        end
        if links > 0.00
          links = durchschnitt;
          B(zeile,spalte-1) = durchschnitt;
        end
        if B(zeile,spalte) > 0.00
          B(zeile,spalte) = durchschnitt;
        end
        if rechts > 0.00
          rechts = durchschnitt;
          B(zeile,spalte+1) = durchschnitt;
        end
        if linksunten > 0.00
          linksunten = durchschnitt;
          B(zeile+1,spalte-1) = durchschnitt;
        end
        if unten > 0.00
          unten = durchschnitt;
          B(zeile+1,spalte) = durchschnitt;
        end
        if rechtsunten > 0.00
          rechtsunten = durchschnitt;
          B(zeile+1,spalte+1) = durchschnitt;
        end  
      end 
      
      % Randzellen = Typ 2
      if Zellentyp == 2
        durchschnitt=((linksoben + oben + rechtsoben + links + (B(zeile,spalte)) + rechts + linksunten + unten + rechtsunten)/6);
        
        % Berechnete Werte je nach Position in die Matrix zurückschreiben
        if linksoben > 0.00
          linksoben = durchschnitt;
          B(zeile-1,spalte-1) = durchschnitt;
        end
        if oben > 0.00
          oben = durchschnitt;
          B(zeile-1,spalte) = durchschnitt;
        end
        if rechtsoben > 0.00
          rechtsoben = durchschnitt;
          B(zeile-1,spalte+1) = durchschnitt;
        end
        if links > 0.00
          links = durchschnitt;
          B(zeile,spalte-1) = durchschnitt;
        end
        if B(zeile,spalte) > 0.00
          B(zeile,spalte) = durchschnitt;
        end
        if rechts > 0.00
          rechts = durchschnitt;
          B(zeile,spalte+1) = durchschnitt;
        end
        if linksunten > 0.00
          linksunten = durchschnitt;
          B(zeile+1,spalte-1) = durchschnitt;
        end
        if unten > 0.00
          unten = durchschnitt;
          B(zeile+1,spalte) = durchschnitt;
        end
        if rechtsunten > 0.00
          rechtsunten = durchschnitt;
          B(zeile+1,spalte+1) = durchschnitt;
        end        
      end
      
      % Innere Zellen = Typ 3        
      if Zellentyp == 3
        durchschnitt=((linksoben + oben + rechtsoben + links + (B(zeile,spalte)) + rechts + linksunten + unten + rechtsunten)/9);
        
        % Gemittelte Werte (Kleinmatrix) in die Grosse Matrix zurückspeichern
        B(zeile,spalte) = durchschnitt;
        B(zeile,spalte-1) = durchschnitt;
        B(zeile+1,spalte-1) = durchschnitt;
        B(zeile+1,spalte) = durchschnitt;
        B(zeile+1,spalte+1) = durchschnitt;
        B(zeile,spalte+1) = durchschnitt;
        B(zeile-1,spalte+1) = durchschnitt;
        B(zeile-1,spalte) = durchschnitt;
        B(zeile-1,spalte-1) = durchschnitt;
      end
      
    endfor %Spalte
  endfor %Zeile

  % Störungen in Matrix einbauen:
  % -----------------------------
  % Anzahl Störungen definieren
  % Für jede Störung zufällige Positionen in der Matrix festlegen (zeile/spalte)
  % Zufällige Störungswerte innerhalb max.Frequenz und min.Frequenz festlegen
  % Störungen in die Matrix zurückschreiben
  % -----------------------------
 

  % Für jede Störung zufällige Positionen definieren
  for (e = (1:anzahlError))
    ezeile =  randi(anzZeilen);
    espalte = randi(anzSpalten);
    B(ezeile,espalte) = minFrequenz + (maxFrequenz-minFrequenz)*rand(1);
    %disp (B(ezeile,espalte))
  endfor % e
  
  disp (i);  
  disp ("Matrix:"), disp(B)
  disp (" ")

endfor % anzahldurchläufe
% Ende Netzausgleich
