\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}