function einfuehrung_in_matlab
% ********************************************
%         Einfuehrung in Matlab
% ********************************************
% Tutorial zur Vorlesung Numerische Mathematik von
% Prof. Carstensen
% Humboldt Universitaet zu Berlin
% Institut fuer Mathematik
% Fachbereich Numerische Analysis


%% Daten
% Initialisieren
% Spaltenvektor Nullen
v = zeros(10,1);
% Zeilenvektor Einsen
w = ones(1,10);
% Zeilenvektor
x = [1,2,3,4,5,6,7];
% Spaltenvektor
y = [1; 2; 3; 4; 5; 6; 7];
% Zeilenvektor
z = 1 : 10;
% Einheitsmatrix 10 kreuz 10
A = eye(10);
% Matrix
B = [1,2,3; 
     4,5,6];
% Diagonalmatrix
C = diag(1:5);
% Vektor [1:24] in 6X4 Matrix reshapen
D = reshape(1:24,[6 4]);
% komplexe Zahlen
a = 3+5i;
% Strings
s = 'Hallo Welt!';

% Ausgabe auf der Console
disp(v)
disp(w)
disp(x)
disp(y)
disp(z)
disp(A)
disp(B)
disp(C)
disp(D)
disp(a)
disp(s)

% Dimensionsangaben
disp(size(B))
disp(size(B,1))
disp(size(B,2))

% Anzahl von Eintraegen einer Matrix
disp(numel(A))
% Laenge eines Vektors
disp(length(x))
% nur nicht null Eintraege
disp(nnz(A)) 

%% Indizierung
% Zeile
disp(A(1,:))
% Spalte
disp(A(:,2))
% Sub-Matrix
disp(A(1:2,1:2))
disp(D([1 3 6],[2 4]))
% lineares Adressieren
disp(B(:))
% erster Eintrag
disp(B(1))
% letzter Eintrag
disp(B(end))

%% Matrix Operationen
A = 2*eye(3);
b = ones(3,1);
c = 1:3;
% Matrix Vektor
disp(A*b)
% Matrix Matrix
disp(A*A)
% Transponieren
disp(b')
% Invertieren
disp(inv(A))
% Scalarprodukt
disp(b'*b);
% Matrix addieren
disp(A+A);
% elementweise multiplizieren
disp(b.*c')
% elementweise dividieren
disp(b./c')
% elementweise potenzieren
disp(c.^2)

%% Matlab Konstanten (besser nicht ueberschreiben!)
disp(pi)
disp(eps)
disp(Inf)
disp(NaN)
disp(true)
disp(false)
% imaginaere Einheit
disp(i)
disp(j)

%% Funktionen
disp(exp(z))
disp(log(z))
phi = 0:pi/8:pi/2;
disp(sin(phi))
disp(cos(phi))
% Normen
A = diag(1:10);
disp(norm(A))
disp(norm(A,'fro'))
% Kondition
disp(cond(A))
disp(cond(A,'fro'))
% Produkt
disp(prod(1:5))
% Kumulative Summe
disp(cumsum(1:5))
% Betrag
disp(abs([-1,2,-3,9]))
% Wurzel
disp(sqrt(1:9))

%% if , case, for, while

% if elseif else end
k = 1;
if k == 1
    disp('k ist 1');
elseif k == 2
    disp('k ist 2');
else
    disp(['k ist',int2str(k)]);
end

% switch case otherwise end
k = 1;
switch k
    case 1
        disp('k ist 1');
    case 2
        disp('k ist 2');
    otherwise
      disp(['k ist',int2str(k)]);
end
          
% for Schleife
val = 0;
for k = 1 : 10000
    val = val + 1/k;
end
disp(val)

% for Schleife rueckwaerts
val = 0;
for k = 10000 : -1 : 1
    val = val + 1/k;
end
disp(val)

% while Schleife
val = 0;
k = 100;
while(k > 100)
    val = val + 1/k;
    k = k -1;
end
disp(val)


%% Lineare Algebra

% LU Zerlegug
n = 5;
A = gallery('poisson',n);
figure(1)
spy(A)
[L,U] = lu(A);
figure(2)
spy(L)
figure(3)
spy(U)

% Lineares Gleichungssystem loesen
b = ones(size(A,1),1);
x = A\b;
y = U\(L\b);
disp(norm(x-y))

% Eigenwerte
disp(eig(A))


%% Plots
% 1D
figure(4)
x = 0 : 0.1 : 2*pi;
y = sin(x);
figure(4)
plot(x,y,'red')

% 2D
figure(5)
[x,y] = meshgrid(0 : 0.1 : 2*pi);
z = sin(x).*sin(y);
surf(x,y,z)

%% Dateien
% schreiben
fid = fopen('test.txt','w');
fprintf(fid,'%d \n',ones(1,10));
fprintf(fid,'%e \n',1.001);
type test.txt
% lesen
x = load('test.txt');
disp(x)

%% Ausgabe mit fprintf in Konsole
fprintf(1,'%s \n',s)
fprintf(1,'pi=%10.4f \t e^10=%7.4f \n',pi,exp(10));
fprintf(1,'pi=%10.4e \t e^10=%7.4e \n',pi,exp(10));
fprintf(1,'pi=%10.4g \t e^10=%7.4g \n',pi,exp(10));



%% Zahlen Formate
x = pi;
disp(x)
format long
disp(x)
format long e
disp(x)
format short
disp(x)

%% Zahl - String
s = num2str(1.001);
disp(s)
s = int2str(1);
disp(s)
x = str2double(s);
disp(x)

%% Funktionen Handles
x = 0 : pi/4 : 2*pi; 
disp(auswerten(@my_Sinus,x));
f = @(x)(sin(x));
disp(f(x))

end

%% Sub-Funktionen
function val = auswerten(f,x)
    val = f(x);
end

function val = my_Sinus(x)
    val = sin(x);
end


