\chapter{Programmierung in \matlab}

\section{Variablen und Datentypen}

\subsection{Variablen}

Eine \determ{Variable} ist ein Zeiger auf eine Stelle im
Speicher. Dieser Zeiger hat einen Namen, den Variablennamen, und einen
\determ{Datentyp} (Abbildung \ref{variablefig}). Im Speicher wird der
Wert der Variablen bin\"ar als eine Folge von \determ[Bit]{Bits} (0
oder 1) gespeichert. Wird auf den Wert der Variable zugegriffen, wird
dieses Bitmuster je nach Datentyp interpretiert. Das Beispiel in
Abbildung \ref{variablefig} zeigt, dass das gleiche Bitmuster im einen
Fall als 8-Bit Integer Datentyp zur Zahl 38 interpretiert wird und im
anderen Fall als Character zum kaufm\"annischen ``und'' ausgewertet
wird. In \matlab{} sind Datentypen nicht von sehr zentraler
Bedeutung. Wir werden uns dennoch sp\"ater etwas genauer mit ihnen
befassen.

\begin{figure}
  \centering
  \begin{subfigure}{.5\textwidth}
    \includegraphics[width=0.8\textwidth]{variable}
    \label{variable:a}
  \end{subfigure}%
  \begin{subfigure}{.5\textwidth}
    \includegraphics[width=.8\textwidth]{variableB}
    \label{variable:b}
  \end{subfigure}
  \titlecaption{Variablen.}{Variablen sind Zeiger auf eine Adresse
    im Speicher, die einen Namen und einen Datentypen beinhalten. Im
    Speicher ist der Wert der Variable bin\"ar gespeichert. Abh\"angig
    vom Datentyp wird dieses Bitmuster unterschiedlich
    interpretiert.}\label{variablefig}
\end{figure}


\subsection{Erzeugen von Variablen}
In \matlab{} kann eine Variable auf der Kommandozeile, in einem Skript
oder einer Funktion an beliebiger Stelle erzeugt werden. Listing
\ref{varListing1} zeigt drei Beispiele:
\begin{lstlisting}[label=varListing1, caption={Erzeugen von Variablen.}]
>> x = 38
x =
    38

>> y = []
y = 
    []

>> z = 'A'
z =
    A
\end{lstlisting}

Die Zeile 1 kann etwa so gelesen werden:''Erzeuge eine Variable mit
dem Namen \varcode{x} und weise ihr den Wert 38 zu''.  Das
Gleichheitszeichen ist der sogenannte
\codeterm{Zuweisungsoperator}. Zeile 5 definiert eine Variable \varcode{y}, der
ein leerer Wert zugewiesen wird. Da \matlab{}, wenn nicht anders
angegeben, immer den \codeterm{double} Datentypen benutzt, haben beide
Variablen diesen Datentyp. In Zeile 9 wird der Variablen \varcode{z} der Buchstabe
``A'' zugewiesen. \varcode{z} ist nicht ein Flie{\ss}kommazahl von Typ \codeterm{double},
sondern ein \codeterm{character} (Zeichen).

Der Datentyp einer Variable kann mit \code{class()} abgefragt werden.
Eine Liste aller definierten Variablen gibt \code{who}
zur\"uck. Detailliertere Informationen \"uber Variablen zeigt
\code{whos} an.

\begin{lstlisting}[label=varListing2, caption={Erfragen des Datentyps einer Variable, Listen aller definierten Variablen.}]
>>class(x)
ans =
      double

>> who
Your variables are:

x  y  z 

>> whos
  Name      Size            Bytes  Class     Attributes

  x         1x1                 8  double              
  y         0x0                 0  double              
  z         1x1                 2  char                
\end{lstlisting}

\begin{important}[Namen von Variablen]
  Bei der Namensgebung ist zu beachten, dass \matlab{} auf Gro{\ss}-
  und Kleinschreibung achtet und ein Variablenname mit einem
  alphabetischen Zeichen beginnen muss. Umlaute, Sonder- und
  Leerzeichen sind in Variablennamen nicht erlaubt.
\end{important}

\subsection{Arbeiten mit Variablen}

Nat\"urlich kann mit den Variablen auch gearbeitet, bzw. gerechnet
werden. \matlab{} kennt alle normalen
\codeterm[Operator!arithmetischer]{arithmetischen Operatoren} wie
\code[Operator!arithmetischer!1add@+]{+},
\code[Operator!arithmetischer!2sub@-]{-},
\code[Operator!arithmetischer!3mul@*]{*} und
\code[Operator!arithmetischer!4div@/]{/}. Die Potenz wird \"uber das
Dachsymbol \code[Operator!arithmetischer!5pow@\^{}]{\^{}}
dargestellt. Listing \ref{varListing3} zeigt, wie sie benutzt werden.

\pagebreak[4]
\begin{lstlisting}[label=varListing3, caption={Rechnen mit Variablen.}]
>> x = 1;
>> x + 10
ans = 
      11
>> x            % x wurde nicht veraendert
ans =
      1

>> y = 2;
>> x + y
ans = 
      3

>> z = x + y
z =
    3

>> z = z * 5;
>> z 
z = 
    15

>> clear z      % loesche die Variable z
\end{lstlisting}

Beachtenswert ist in Zeilen 2 und 6, dass mit dem Inhalt einer
Variablen gerechnet werden kann, ohne dass dadurch ihr Wert
ver\"andert wird. Wenn der Wert einer Variablen ver\"andert werden
soll, dann muss der neue Wert explizit einer Variablen zugewiesen werden
(mit dem \code[Operator!Zuweisung!=]{=} Zuweisungsoperator,
z.B. Zeilen 14 und 18). Zeile 23 zeigt wie eine einzelne Variable
gel\"oscht wird.


\subsection{Datentypen}

Der Datentyp bestimmt, wie die im Speicher abgelegten Bitmuster
interpretiert werden. Die wichtigsten Datentpyen sind:
\begin{itemize}
\item \codeterm{integer}: Ganze Zahlen. Hier gibt es mehrere
  Unterarten, die wir in \matlab{} (meist) ignorieren k\"onnen.
\item \codeterm{double}: Flie{\ss}kommazahlen. Im Gegensatz zu den reelen Zahlen, die durch diesen Datentyp dargestellt werden, sind sie abz\"ahlbar.
\item \codeterm{complex}: Komplexe Zahlen.
\item \codeterm{logical}: Boolesche Werte, die als wahr
  (\code{true}) oder falsch (\code{false}) interpretiert werden.
\item \codeterm{char}: ASCII Zeichen
\end{itemize}
Unter den numerischen Datentypen gibt es verschiedene Arten mit
unterschiedlichem Speicherbedarf und Wertebreich (siehe
Tabelle~\ref{dtypestab}).

\begin{table}[t]
  \centering
  \titlecaption{Grundlegende numerische Datentypen und ihr Wertebereich.}{}
  \label{dtypestab}
  \begin{tabular}{llcl}\hline
    Datentyp & Speicherbedarf & Wertebereich & Beispiel \erh \\ \hline
    \code{double} & 64 bit & $\approx -10^{308}$ bis $\approx 10^{308} $&  Flie{\ss}kommazahlen.\erb\\
    \code{int} & 64 bit & $-2^{31}$ bis $2^{31}-1$ &  Ganzzahlige Werte  \\
    \code{int16} & 16 bit & $-2^{15}$ bis $2^{15}-1$ & Digitalisierte Spannungen. \\
    \code{uint8} & 8 bit & $0$ bis $255$ & Digitalisierte Imaging Daten. \\ \hline  
  \end{tabular}
\end{table}

\matlab{} arbeitet meist mit dem \codeterm{double} Datentyp wenn numerische
Daten gespeichert werden. Dennoch lohnt es sich, sich ein wenig mit
den Datentypen auseinanderzusetzen (Box \ref{daqbox}). 

\begin{ibox}[t]{\label{daqbox}Digitalisierung von Messdaten}
  Szenario: Die elektrische Aktivit\"at (z.B. die Membranspannung)
  einer Nervenzelle wird gemessen. Die gemessene Spannung wird mittels
  Messkarte digitalisiert und auf dem Computer f\"ur weitere Analysen
  gespeichert. Typischerweise k\"onnen mit solchen Messkarten
  Spannungen im Bereich $\pm 10$\,V gemessen werden. Die Aufl\"osung
  der Analog-Digitalwandler betr\"agt heutzutage meistens 16 bit. Das
  heisst, dass der gesamte Spannungsbereich in $2^{16}$ Schritte
  eingeteilt ist. Die gemessenene Spannung wird auf digitalisierte
  Werte abgebildet.\vspace{0.25cm}

  \begin{minipage}{0.5\textwidth}
    \includegraphics[width=0.9\columnwidth]{data_acquisition}
  \end{minipage}
  \begin{minipage}{0.5\textwidth}
    Um die Spannung auf den \code{int16} Datentyp abzubilden:
    \[ y = x \cdot 2^{16}/20\] mit $x$ der gemessenen Spannung und $y$
    dem digitalisierten Wert bei einem Spannungsbereich von
    $\pm10$\,V. Das ergibt ganzzahlige Werte zwischen $-2^{15}=-32768$
    und $2^{15}-1 = 32767$.

    Durch Umkehrung kann der digitalisierte Wert wieder
    in eine Spannung zur\"uckgewandelt werden:
    \[ x = y \cdot 20/2^{16} \]
  \end{minipage}\vspace{0.25cm}

  Um Speicherplatz zu sparen ist es sinnvoll, die gemessenen Daten als
  \code{int16} anstelle der \code{double} Werte im Rechner abzulegen.  Die
  Daten als Spannungswerte, also als Flie{\ss}kommawerte,
  abzulegen ben\"otigt den 4-fachen Speicherplatz (8 statt 2 Bytes)
  und bietet keine zus\"atzliche Information.
\end{ibox}

