211 lines
7.6 KiB
TeX
211 lines
7.6 KiB
TeX
\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}
|
|
|