\documentclass[12pt,a4paper,pdftex]{exam}

\usepackage[german]{babel}
\usepackage{natbib}
\usepackage{graphicx}
\usepackage[small]{caption}
\usepackage{sidecap}
\usepackage{pslatex}
\usepackage{amsmath}
\usepackage{amssymb}
\setlength{\marginparwidth}{2cm}
\usepackage[breaklinks=true,bookmarks=true,bookmarksopen=true,pdfpagemode=UseNone,pdfstartview=FitH,colorlinks=true,citecolor=blue]{hyperref}

%%%%% text size %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\usepackage[left=20mm,right=20mm,top=25mm,bottom=25mm]{geometry}
\pagestyle{headandfoot} \header{{\bfseries\large \"Ubung
    2}}{{\bfseries\large Vektoren und Matrizen}}{{\bfseries\large 12. Oktober, 2015}}
\firstpagefooter{Dr. Jan Grewe}{Phone: 29 74588}{Email:
  jan.grewe@uni-tuebingen.de} \runningfooter{}{\thepage}{}

\setlength{\baselineskip}{15pt}
\setlength{\parindent}{0.0cm}
\setlength{\parskip}{0.3cm}
\renewcommand{\baselinestretch}{1.15}

\newcommand{\code}[1]{\texttt{#1}}
\renewcommand{\solutiontitle}{\noindent\textbf{L\"osung:}\par\noindent}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
\begin{document}

\vspace*{-6.5ex}
\begin{center}
  \textbf{\Large Einf\"uhrung in die wissenschaftliche Datenverarbeitung}\\[1ex]
  {\large Jan Grewe, Jan Benda}\\[-3ex]
  Abteilung Neuroethologie \hfill --- \hfill Institut f\"ur Neurobiologie \hfill --- \hfill \includegraphics[width=0.28\textwidth]{UT_WBMW_Black_RGB} \\
\end{center}

Die folgenden Aufgaben dienen der Wiederholung, \"Ubung und
Selbstkontrolle und sollten eigenst\"andig bearbeitet und gel\"ost
werden. Die L\"osung soll in Form eines einzelnen Skriptes (m-files)
im ILIAS hochgeladen werden. Jede Aufgabe sollte in einer eigenen
``Zelle'' gel\"ost sein. Die Zellen \textbf{m\"ussen} unabh\"angig
voneinander ausf\"uhrbar sein. Das Skript sollte nach dem Muster:
\linebreak ``vektoren\_matrizen\_\{nachname\}.m'' benannt werden
(z.B. vektoren\_matrizen\_mueller.m).

\begin{questions}
  \section*{Vektoren}
    \question Erzeuge Vektoren mit folgendem Inhalt: 
    \begin{parts}
      \part Von 1 bis 10 in ganzzahligen Schritten.
      \begin{solution}
        \code{a = 1:10;}
      \end{solution}
      \part Von 0 bis 20 in 2er Schritten.
      \begin{solution}
        \code{a = 0:2:20;}
      \end{solution}
      \part Mit \textbf{absteigendem} Inhalt von 100 bis 0.
      \begin{solution}
        \code{a = 100:-1:0;}
      \end{solution}
      \part In 10 Schritten von 0 bis 1.
      \begin{solution}
        \code{a = 0:0.1:1;}
      \end{solution}
      \part In 11 Schritten von 0 bis 1.
      \begin{solution}
        \code{a = 0:1/11:1;}
      \end{solution}
      \part In 50 Schritten von 0 bis $2\pi$ ($\pi$ ist als Konstante
      \code{pi} in Matlab definiert).
      \begin{solution}
        \code{a = 0:2*pi/50:2*pi;}
      \end{solution}
    \end{parts}

    \question Rechnen mit Vektoren:
    \begin{parts}
      \part Definiere einen Vektor \code{x = [3 2 6 8];}
      \part Wie gro{\ss} ist der Vektor? Benutze die Funktionen
      \code{size} und \code{length}. Was ist der Unterschied zwischen
      den beiden Funktionen?
      \begin{solution}
        \code{x = [3 2 6 8]; \\ disp(length(x));\\   4\\ disp(size(x))\\ 1  4}
      \end{solution}
      \part Wie \"andern sich \code{size} und \code{length} des
      Vektors wenn er transponiert wird?
      \begin{solution}
        L\"ange \"andert sich nicht. R\"uckgabewert von size ist invertiert.
      \end{solution}
      \part Addiere 5 zu jedem Element von \verb+x+.
      \begin{solution}
        \code{disp(x + 5)}
      \end{solution}
      \part Multipliziere jedes Element von \code{x} mit 2; 
      \begin{solution}
        \code{disp(x * 2)}
      \end{solution}
      \part Definiere einen zweiten Vektor (\verb+y = [4 1 3 5];+).
      Stelle sicher, dass \code{x} wieder in seiner urspr\"unglichen
      Form ist.
      \part Addiere beide Vektoren \code{x + y}.
      \begin{solution}
        \code{y = [4 1 3 5]; \\disp(x + y)\\7     3     9    13}
      \end{solution}
      \part Subtrahiere beide Vektoren \code{x - y}.
      \begin{solution}
        \code{disp(x - y)\\-1     1     3    3}
      \end{solution}
      \part Multipliziere beide Vektoren \code{x * y}.
      \begin{solution}
        \code{disp(x * y)\\Error using *. Inner matrix dimension must agree.}
      \end{solution}
      \part Erkl\"are die Fehlermeldung.
      \begin{solution}
        * ist der Operator f\"ur die Matrixmultiplikation. Bei dieser
        muessen die inneren Dimensionen \"uebereinstimmen.\linebreak
        \code{disp(size(x))\\1   4 \\disp(size(y)) \\ 1   4}\\
        (m,n)*(n,o) w\"are ok.
      \end{solution}
      \part Was m\"usste man machen, damit \code{mtimes} bzw. der
      \code{*} Operator funktionieren?
      \begin{solution}
        y m\"usste transponiert werden: \code{x * y'}
      \end{solution}
      \part Multipliziere die Vektoren elementweise (\code{x .* y})
      und weise das Ergebnis eine neuen Variablen zu.
      \begin{solution}
        \code{z = x .* y;}
      \end{solution}
    \end{parts}

    \question Erzeugen von Vektoren mit Helferfunktionen:
    \begin{parts}
      \part Erstelle einen 100 Elemente langen Vektor mit der Funktion
      \code{ones} (siehe Hilfe). Was macht sie?
      \begin{solution}
        \code{ones(100,1)} erzeugt einen Vektor bei dem alle Elemente mit 1 gef\"ullt sind.
      \end{solution}
      \part Erstelle einen 100 Elemente langen Vektor mit der Funktion
      \code{zeros}. Was macht diese?
      \begin{solution}
        \code{zeros(100,1)} erzeugt einen Vektor bei dem alle Elemente mit 0 gef\"ullt sind.
      \end{solution}
      \part Erstelle einen 100 Elemente langen Vektor in dem jedes
      Element den Wert 4.5 hat.
      \begin{solution}
        \code{ones(100,1) * 4.5}
      \end{solution}
      \part Erzeuge einen Vektor mit 100 Zufallszahlen (\code{rand},
      siehe Hilfe).
      \begin{solution}
        \code{x = rand(100,1)}
      \end{solution}
      \part Erzeuge einen Vektor mit 100 Werten zwischen 0 und 1
      mithilfe der Funktion \code{linspace}.
      \begin{solution}
        \code{x = linspace(0,1,100)}
      \end{solution}
    \end{parts}

    \question Indizieren in Vektoren:
    \begin{parts}
      \part Erzeuge einen Vektor mit 100 Elementen (0 - 100).
      \begin{solution}
        \code{x = linspace(0,100,100);}
      \end{solution}
      \part Gib jeweils den ersten, den letzten, den 5., 24. und den
      vorletzten Wert aus.
      \begin{solution}
        \code{disp(x(1))\\ disp(x(end))\\ disp(x(5))\\ disp(x(24))\\ disp(x(end-1))}
      \end{solution}
      \part Gib die ersten 10 Werte aus.
      \begin{solution}
        \code{x(1:10)}
      \end{solution}
      \part Gib die letzten 10 Werte aus.
      \begin{solution}
        \code{disp(x(end-9:end))}
      \end{solution}
      \part Versuche den Wert an der Stelle 0 auszugeben.
      \begin{solution}
        \code{x(0)\\ Subscript indices must either be real positive integers or logicals.}
      \end{solution}
      \part Versuche den Wert an der Stelle 110 auszugeben.
      \begin{solution}
        \code{x(110)\\ Index exceeds matrix dimensions.}
      \end{solution}
      \part Gib die Werte an den Stellen 3, 15, und 42 zusammen als
      Vektor aus.
      \begin{solution}
        \code{disp(x([3 15 42]))}
      \end{solution}
      \part Gib 10 zuf\"allig ausgew\"ahlte Werte aus (benutze
      \verb+randi+ um die Indizes zu erstellen).
      \begin{solution}
        \code{x(randi(100,10,1))}
      \end{solution}
    \end{parts}

    \question Erzeuge eine Variable und speichere etwas Text in ihr,
    so dass mindestens 2 Worte vorhanden sind.  (z.B. \code{x = 'some
    text'}). Benutze die Indizierung um die W\"orter einzeln
    auszugeben.
    \begin{solution}
      \code{x = 'some text'; \\ disp(x(1:4))\\disp(x(6:end))}
    \end{solution}


  \newpage
  \section*{Matrizen}

  \question Erstelle folgende Matrix
  \[ A = \left( \begin{array}{ccc} 7 & 3 & 5 \\ 1 & 8 & 3 \\ 8 & 6 &
      4 \end{array} \right) \]
  \begin{parts}
    \part Benutze die Funktion \code{size} um die Gr\"o{\ss}e vpm \code{A} anzeeigen zu lassen.
    \begin{solution}
      \code{x = [7 3 5; 1 8 3; 8 6 4];\\disp(size(x))}
    \end{solution}
    \part Finde heraus, wie man \code{size} aufruft um nur die L\"ange entlang einer einzelnen Dimension auszugeben. Gib einzeln die L\"angen beider Dimensionen aus.
    \begin{solution}
      \code{disp(size(x, 1))}\\\code{disp(size(x, 2))}
    \end{solution}
    \part Gib das Element in der 3. Zeile und 2. Spalte aus.
    \begin{solution}
      \code{x(3,2)}
    \end{solution}
    \part Gib jeweils alle Elemente der 1., 2. und 3. Zeile aus.
    \begin{solution}
      \code{disp(x([1 2 3],:));}
    \end{solution}
    \part Gib jeweils alle Elemente der 1., 2., und 3. Spalte aus.
     \begin{solution}
      \code{disp(x(:, 1))\\ disp(x(:, 2))\\ disp(x(:, 3))}
    \end{solution}
    \part Erh\"ohe das Element in der 2. Zeile und 3. Spalte um Eins.
    \begin{solution}
      \code{x(2,3) = x(2,3) + 1;}
    \end{solution}
    \part Ziehe von allen Elementen der 1. Zeile 5 ab.
    \begin{solution}
      \code{x(1,:) = x(1,:) - 5;}
    \end{solution}
    \part Multipliziere alle Elementen der 3. Spalte mit 2.
    \begin{solution}
      \code{x(:,3) = x(:,3) * 2;}
    \end{solution}
  \end{parts}

  \question Erstelle eine $5 \times 5$ Matrix \code{M} die
  Zufallszahlen enth\"alt (nutze die MATLAB Funktion
  \verb+randn()+. Benutze die Hilfe: Was macht die Funktion?).
  \begin{parts}
    \part Gib das Element in der 2. Zeile und 3. Spalte aus.
    \begin{solution}
      \code{M = randn(5, 5);}
      \code{disp(M(2,3))}
    \end{solution}
 
    \part Gib jeweils alle Elemente der 1., 3. und letzten Zeile aus.
    \begin{solution}
      \code{disp(M(1,:)) \\ disp(M(3,:))\\ disp(M(size(M,1), :))}
    \end{solution}

    \part Gib jeweils alle Elemente der 2. und 4. Spalte aus.
    \begin{solution}
      \code{disp(M(:,2))\\ disp(M(:,4))}
    \end{solution}
 
    \part Greife mit einem einzigen Kommando auf die Elemente jeder
    zweiten Spalte zu und speichere die Daten in einer neuen Variable.
    \begin{solution}
      \code{y = M(:, [2:2:size(M,2)])}
    \end{solution}

    \part Berechne jeweils den Mittelwert der 1., 3. und 5. Zeile
    (Funktion \code{mean}, siehe Hilfe).
    \begin{solution}
      \code{mean(M([1 3 5],:), 2)}
    \end{solution}

    \part Berechne die Summe aller Werte der 2. und 4. Spalte
    (Funktion \code{sum}, siehe Hilfe).
    \begin{solution}
      \code{sum(M(:, [2 4]), 1)}
    \end{solution}

    \part Berechne die Summe aller Elemente der Matrize.
    \begin{solution}
      \code{sum(M(:))}
    \end{solution}

    \part Ersetze die Elemente der 2. Zeile mit denen der 4.
    \begin{solution}
      \code{M(2,:) = M(4,:)}
    \end{solution}

    \part F\"uhre folgendes Kommando aus: \code{M(1:2,1) = [1, 2,
      3]}. Was k\"onnte die Absicht dieses Codes gewesen sein? Was
    bedeutet die Fehlermeldung?
    \begin{solution}
      \code{M(1:2,1) = [1, 2,3];\\ Subscripted assignment dimension
        mismatch.}  \\ Der einzuf\"ugende Vektor hat 3 Elemente, die
      Auswahl von M in die geschrieben werden soll hat nur die
      Gr\"o{\ss}e 2;
    \end{solution}
  \end{parts}

  \question Matrizen k\"onnen neben der ``normalen''
  \textit{subscript} Indizierung auch \textit{linear} indiziert werden
  (siehe Hilfe \"uber Indexing oder Funktionen \verb+sub2ind+ oder
  \verb+ind2sub+).
  \begin{parts}
    \part Erstelle eine 2-D Matrix mit Zufallszahlen mit der Dimensionalit\"at
    \verb+[10,10]+.
    \begin{solution}
      \code{x = randn(10, 10)}
    \end{solution}

    \part Wie viele Werte enth\"alt sie?
    \begin{solution}
      \code{disp(numel(x))}
    \end{solution}

    \part Benutze das lineare Indizieren um 50 zuf\"allige Werte
    auszuw\"ahlen.
    \begin{solution}
      \code{x(randi(100, 50, 1)])}
    \end{solution}

    \part Wo liegt der Vorteil gegen\"uber der \textit{subscript}
    Indizierung?
    \begin{solution}
      Die Matrize ist 2-dimensional. Wenn mit dem subscript index
      zugegriffen werden soll, dann muss auf die Dimensionen
      einzeln geachtet werden. Mit dem linearen Indexieren kann einfach
      einen Vektor mit n Indices benutzt werden. Wenn es auch noch eine
      eindeutige (ohne doppelte) Auswahl sein soll, dann muss bei
      2-D viel komplexer kontrollieren.
    \end{solution}
    \part Berechne die Summe aller Werte mit einem Funktionsaufruf..
    \begin{solution}
      \code{sum(x(:))} oder \code{sum(sum(x))}
    \end{solution}

  \end{parts}
  
  \question Erstelle folgende Variablen \verb+x = [1 5 9]+ and
  \verb+y = [7 1 5]+ und \verb+M = [3 1 6; 5 2 7]+. Welche der
  folgenden Operationen funktionieren? Wenn nicht, warum funktionieren
  sie nicht? Teste Deine Vorhersagen.
  \begin{parts}
    \part \code{x + y}
    \begin{solution}
      Funktioniert!
    \end{solution}

    \part \code{x * M}
    \begin{solution}
      Matrixmultiplikation Funktioniert nicht! Inner dimensions must agree!
    \end{solution}

    \part \code{x + y'}
    \begin{solution}
      Funktioniert nicht! Die Dimensionalit\"aten passen nicht.
    \end{solution}

    \part \code{M - [x y]}
    \begin{solution}
      Funktioniert nicht! \code{[x y] ist ein Zeilenvektor der L\"ange
        6, M ist eine Martix.}
    \end{solution}

    \part \code{[x; y]}
    \begin{solution}
      Funktioniert! Gr\"o{\ss}e: 2  3
    \end{solution}

    \part \code{M - [x; y]}
    \begin{solution}
      Funktioniert!
    \end{solution}
  \end{parts}
  
  \question Erstelle eine 3-D Matrix aus drei 2-D Matrizen. Benutze
  die \verb+cat()+ Funktion f\"ur diesen Zweck (schaue in der Hilfe
  nach, wie sie benutzt wird).
  \begin{parts}
    \part Gib alle Elemente des ersten ``Blattes'' aus (Index 1 der 3. Dimension).
    \begin{solution}
      \code{x = randn(5,5); \\y = randn(5, 5);\\ z = cat(3, x, y);\\disp(z(:,:,1))}
    \end{solution}
  \end{parts}
  
  \question Erzeuge eine $5 \times 5 \times 5$ Matrix die mit
  ganzzahligen, gleichverteilten Zufallszahlen zwischen 0 und 100
  gef\"ullt ist.
  \begin{parts}
    \part Berechne den Mittelwert aller Bl\"atter dieser Matrix
    (benutze \verb+mean()+, siehe Hilfe).
    \begin{solution}
      \code{x = round(rand(5,5,5) .* 100);\\ Disp(mean(mean(x(:,:,1))))\\ disp(mean(mean(x(:,:,2)))) \\ disp(mean(mean(x(:,:,3))))}
    \end{solution}
  \end{parts}
  \end{questions}

\end{document}
