%% MATLAB 
% Eine Kurzeinfuehrung in Matlab
%
% Wurde dieses File durch |echodemo vorlesung|  aufgerufen, kann 
% es Schrittweise ausgefuehrt werden.
%
% Mit den Links oben kann vorwaerts navigiert oder 
% abgebrochen werden.
% Ist die Ausgabe eines Abschnitts laenger als eine Seite
% muss man nach oben scrollen um an die Links zu gelangen.
% 
% 
%% Vorbereitung
% |clear all| loescht alle gesetzten Werte. Dies verhindert,
% dass das Skript durch vorherige Definitionen verwirrt wird.
clear all;

%% Variablenzuweisung
% Variablen werden mit |=| Werte oder Ergebnisse von Berechnungen zugewiesen
x=1
y=2
z=x+y

%% Unterdrueckung der Ausgabe
% Soll das Ergebnis eines Befehls oder einer Zuweisung nicht ausgegeben
% werden, so muss man ihn einfach mit |;| abschliessen
x=1;
sin(x);

%%
% Matlab kennt schon typische Groessen wie
% das komplexe i oder Naturkonstanten wie $\pi$
i
exp(i*pi)

%% Warnung
% Vorsicht, auch alle internen Variablen und Funktionen 
% lassen sich umdefinieren
i=1 
sin=5

%% Was zu unerwarteten Ergebnissen fuehren kann...
% Gerade i ist ja als Schleifenzaehler beliebt
exp(i*pi)

%% ... oder zu Fehlern
% deren Warnung zwar stimmt aber nicht unbedingt die Ursache erklaert.
% ein Blick auf die definierten Variablen (-> Workspace) lohnt sich 
sin(pi)

%% Clear
% Mit clear lassen Variablen oder Funktionen wieder aus dem Speicher
% loeschen. Vordefinierte Variablen nehmen dann wieder ihre alten Werte
% an. 
clear i
clear sin
%% Und alles funktioniert wieder wie erwartet
i
sin(pi)

%% Vektor, Definition, Wertzuweiseung
% Zeilenvektor werden mit eckigen Klammern definiert
% die Eintraege einfach durch Whitespaces oder Kommata getrennt
x=[1 3 4 2]

%% Doppelpunkt-Operator
% Mit dem Doppelpunkt-operator werden fortlaufende, äquidistante
% Listen/Vektoren erzeugt.
x = 1:4
x = 0:0.1:0.4

%% Transposition
% Vektoren und Matrizen lassen sich durch "dot-Tick" transponieren:
x.'

%%
% Der transponierte Vektor ist identisch zum Spaltenvektor bei dem die
% Einträge durch |;| getrennt werden.
x2=[1;3;4;2]
x2.'

%% Zugriff
% Auf die einzelnen Elemente des Vektors wird ueber runde Klammern
% zugegriffen. Dabei koennen die Elemente angezeigt oder ihnen Werte zugewiesen
% werden
x
x(2)
x(2)=7
x(1:2)=1

%% Matrix, Definition, Wertzuweisung
% Im folgenden werden wir Matrizen-Variablen gross und
% Vektor-Variablen klein schreiben. Dies dient nur der
% besseren Lesbarkeit, ist aber keine Konvention von Matlab
%
% Die Reihen von Matrizen werden durch ; getrennt.
% Ein Spaltenvektor ist somit eigentlich eine n x 1 - Matrix
X=[ 1 3 i 2 ; i 1 3 2 ]

%% Transponierte Matrix:
% Auch Matrizen lassen sich mit .' transponieren
X
X.'
%%
% mit ' (ohne .) erhaelt man die adjungierte Matrix (also mit komplexer Konjugation)
% was eine beliebte Fehlerquelle darstellt.
X
X'

%% Zugriff auf Matrix-Elemente
% 
X=[ 1 3 4 2 ; 2 1 3 2 ; 4 9 2 0 ]
X(2,3)=7

%%
% Nicht nur auf einzelne Elemente, auch auf Teilmatrizen
% Spalten und Zeilen kann geziehlt zugegriffen werden:
X(2:3,3:4)
X(:,1)
X(1,:)
x(:,1:2)


%% Elementweises Rechnen mit Vektoren
% Die Grundrechenarten werden eigentlich als Matrixoperationen
% interpretiert. Stellt man der Operation allerdings ein |.| voran
% so wird diese auf jedes Element einzeln angewendet.
% Die Funktion <matlab:doc('linspace') linspace(X1,X2,N)> generiert einen 
% einen aequidistanten Vektor mit N Stuetzstellen zwischen X1, X2.
x=linspace(1,10,9)
y=x.^2

%% Elementweises Rechnen mit Matrizen
% Auf die gleiche Art fuehrt man Berechnungen für jedes Element
% einer Matrix durch.
% Mit <matlab:doc('colon') colon> bzw. der Kurzform |:| kann man
% Vektoren aus Werten mit angegebenem Abstand erzeugen.
x=(0:0.1:1).^2
X=[ 0:0.1:0.5 ; (0:0.1:0.5).^2 ; 0:0.2:1; (0:0.2:1).^2 ]
X./2

%% Funktionen auf Vektoren...
% Alle üblichen Funktionen sind implementiert. Wird als Option ein Vektor
% übergeben so wird die Funktion auf jedes Element *einzeln* angewandt.
x
y=cos(x)
y=cos(X(1,:))

%% ...und Matrizen
% ebenso kann man mit den Elementen einer Matrix rechnen
X
Y=cos(X)
Y=exp(-X)

%% Matrizen II
% Matrizen koennen auch definiert werden in dem man ganzen Bereichen
% Werte zuweist
% Setzt man nur einen einzelnen Wert, wird der Rest der Matrix mit 0
% aufgefuellt.
A(1:4,1:4)=1
clear A
A(4,4)=1
clear A

%% Hoehere Dimensionen
% Neben Vektoren und Matrizen lassen sich Arrays beliebiger Dimension
% definieren.
A(1:4,1:4,1:2)=1
clear A

%% Meshgrid
% Mit <matlab:doc('meshgrid') meshgrid> koennen komfortabel Gitter erzeugt
% werden.

[X,Y] = meshgrid(0:0.1:0.5,0:0.2:0.8)
Z=Y.*cos(pi*X)

%% Matrixdiagonale
% <matlab:doc('diag') diag>
% Diagonale
A = [1 2 3 4; 5 6 7 8; 9 10 11 12; 13 14 15 16]
x=diag(A)
B=diag(x)

%%
% Nebendiagonalen
clear y
y(1:3)=1
B=diag(y,-1)
B=diag(x)+diag(y,-1)+diag(y,+1)

%% Vektor Operationen
% Alle Operatoren wie * / ^ sind Matrixoperationen
% (A,x ist nur die Ausgabe von A und x zur Erinnerung)
A,x

A*x
%%
% funktionieren natuerlich nur, wenn sie auch definiert sind.
A*x'
%%
% Division entspricht der Multiplikation mit der Inversen, ist
% aber resourcensparender implementiert als Invertieren+Multiplizieren
A/B
A*B^-1
%%
% Funktioniert allerdings natuerlich nur wenn die Matrix durch die
% dividiert werden soll nicht singulaer ist.
B/A
det(A)
%% Funktionen von Matrizen
% Die Standardfunktionen wirken elementweise auf Matrizen,
% es gibt allerdings Spezialfunktionen, die Matrixfunktionen 
% (definiert ueber die Reihenentwicklung) sind.
% Ein wichtiges Beispiel ist:
% <matlab:doc('expm') expm>
%   expm   Matrix exponential
C=ones(3,3)
exp(C)
expm(C)
%%
A*B(:,1)
B(1,:)*A

%% Typische Matrixoperationen
A,B
trace(A)
det(B)

%% Eigenwerte, Eigenvektoren
% <matlab:doc('eig') eig>
B
eig(B)
%%
[V,E]=eig(B)
B*V(:,1)
E(1,1)*V(:,1)
%% Duennbesetzte ("sparse") Matrizen
% Haeufig muss man mit sehr grossen Matrizen arbeiten, die aber 
% nur duenn besetzt sind. D.h. bei denen nur wenige Eintraege ungleich
% null sind. Fuer diese "sparse" Matrizen bietet Matlab spezielle
% Funktionen die wesentlich effizienter mit dem Arbeitsspeicher umgehen.
% Normale Matrizen lassen sich in Sparse-Matrizen umwandeln:
A=eye(5)
B=sparse(A)
% Wie man sieht werden bei Sparse-Matrizen, nur die "Koordinaten" und
% Werte der Eintraege ungleich null abgespeichert.
%% 
% Umgekehrt kann man mit <matlab:doc('full') full>  Sparse-Matrizen wieder
% zu "normalen" Matrizen umwandeln.
C=full(B)

%% Spezielle Funktionen fuer Sparse-Matrizen
% In der Regel wird man Matrizen allerdings nicht umwandeln, sondern
% gleich als Sparse-Matrizen anlegen.
% Hier hilft insbesondere der Befehl <matlab:doc('spdiags') spdiags>
% um Bandmatrizen anzulegen.
% Dessen Aufruf man sich allerdings genau in der Hilfe ansehen sollte...
B=[1:100;1:100;1:100].'
S=spdiags(B,-1:1,100,100)

%% 
% ... insbesondere wie die Matrix aufgefuellt wird

full(S(1:5,1:5))
full(S(95:100,95:100))

%% 
% Der Befehl <matlab:doc('spy') spy> hilft die Struktur von Sparse
% Matrizen darzustellen. Die Nz ist die Zahl der Eintraege ungleich Null
% und jeder Eintrag wird als Punkt dargestellt.
spy(S)

%% Sparse-Matrizen- Eigenwerte
% Fuer Sparse-Matrizen gibt es eine spezielle Routine zur Berechnung
% der Eigenwerte und Eigenvektoren.
% <matlab:doc('eigs') eigs> berechnet dabei nicht alle Eigenwerte/-Vektoren
% sondern nur die 5 Groessten
% Wobei man die Anzahl und das Kriterium aendern kann, so gibt 

eigs(S,7)
% der folgende Befehl
eigs(S,6,'sm') 
% z.B. die 6 vom Betrag kleinsten Eigenwerte aus.

%% 2 dimensionale Graphen
t=0:0.1:2;
x=cos(pi*t);
plot(t,x)
%%
plot(t,x,'r')
xlabel('t')
ylabel('xi')
%%
% hold
y=exp(-t);
plot(t,y);

hold on
plot(t,x,'g')
hold off
%%
plot(t,x)

%%
Z,X
plot(X(1,:),Z)

%% 2D Daten visualisieren:
% <matlab:doc('surf') surf>
% <matlab:doc('mesh') mesh>
[x,y] = meshgrid(-1:0.1:1,-1:0.1:1);
z = exp(-(x.^2+y.^2));

pcolor(x,y,z);
%%
mesh(x,y,z)
%%
surf(x,y,z);
%%
meshc(x,y,z)
%%
surfc(x,y,z)

%%  Parametrische Plots in 3D
% <matlab:doc('plot3') plot3>
t=0:pi/50:10*pi;
plot3(sin(t),cos(t),t)
grid on
axis square

%% Import von Daten
% <matlab:doc('load') load>
% Matrix von Z-Werten
load SINM.dat
surf(SINM)


%% Export von Daten
%  save

x=1:0.1:2; y=x.^2;
save('/tmp/test.dat','-ascii','x')

unix('cat /tmp/test.dat')
%% Funktionen
open sinc
sinc(1)
%% Programmieren
open progDemo
%% Demo 5
teapotdemo

