[translation] programming chapter first part translated 1/6

This commit is contained in:
Jan Grewe 2016-10-08 16:53:21 +02:00
parent 30e37ba4be
commit bc5aebc793

View File

@ -1,23 +1,23 @@
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\chapter{Programmierung in \matlab}
\chapter{Programming in \matlab}
\section{Variablen und Datentypen}
\section{Variables and data types}
\subsection{Variablen}
\subsection{Variables}
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.
A \enterm{variable} is a pointer to a certain place in the computer's
memory. This pointer is characterized by its name, the variable's
name, and the \enterm{data type} (figure~\ref{variablefig}). In the
computer's memory the value of the variable is stored in binary form
that is as a sequence of zeros and ones (\enterm[Bit]{Bits}). When the
variable is read from the memory, this binary pattern is interpreted
according to the data type. The example shown in
figure~\ref{variablefig} shows that the very same bit pattern is either
interpreted as a 8-bit integer type (numeric value 38) or as a
ampersand (&) character. In \matlab{} data types are of only minor
importance but there are occasions where it becomes important to know
the type of a variable and we will come back to them later on.
\begin{figure}
\centering
@ -29,19 +29,20 @@ befassen.
\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}
\titlecaption{Variables.}{Variables are point to a memory
address. They further are described by their name and
data type. The variable's value is stored as a pattern of binary
values (0 or 1). When reading the variable this pattern is
interpreted according to the variable's
data type.}\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.}]
\subsection{Creating variables}
In \matlab{} variables can be created at any time on the command line
or any place in a script or function. Listing~\ref{varListing1} shows
three different possibilities:
\begin{lstlisting}[label=varListing1, caption={Creating variables.}]
>> x = 38
x =
38
@ -55,22 +56,22 @@ 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.}]
Line 1 can be read like: ``create a variable with the name \varcode{x}
and assign the value 38''. The equal sign is the so called
\codeterm{assignment operator}. Line 5 defines a variable \varcode{y}
and assigns an empty value. If not explicitly specified \matlab{}
variables will have the \codeterm{double} (a numeric data type, see
below) data type. In line 9, however, we create a variable \varcode{z}
and assign the character ``A'' to it. Accordingly, \varcode{z} does
not have the numeric \codeterm{double} data type but is of the type
\codeterm{character}.
The actual data type of a variable can be found out with the
\code{class()} function. \code{who} prints a list of all defined
variables and \code{whos} provides detailed information
(listing~\ref{varListing2}).
\begin{lstlisting}[label=varListing2, caption={Requesting information about defined variables and their types.}]
>>class(x)
ans =
double
@ -88,32 +89,30 @@ x y z
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.
\begin{important}[Naming conventions]
There are a few rules regarding the variable names. \matlab{} is
case-sensitive, i.e. \code{x} and \code{X} are two different
names. Names must begin with an alphabetic character. German (or
other) umlauts, special characters and spaces are forbidden.
\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.
\subsection{Working with variables}
We can certainly work, i.e. do calculations, with variables. \matlab{}
knows all basic \codeterm[Operator!arithmetic]{arithmetic operators}
such as \code[Operator!arithmetic!1add@+]{+},
\code[Operator!arithmetic!2sub@-]{-},
\code[Operator!arithmetic!3mul@*]{*} and
\code[Operator!arithmetic!4div@/]{/}. The power is denoted by the
\code[Operator!arithmetic!5pow@\^{}]{\^{}}. Listing~\ref{varListing3}
show their use.
\pagebreak[4]
\begin{lstlisting}[label=varListing3, caption={Rechnen mit Variablen.}]
\begin{lstlisting}[label=varListing3, caption={Working with variables.}]
>> x = 1;
>> x + 10
ans =
11
>> x % x wurde nicht veraendert
>> x % x has not changed!
ans =
1
@ -131,83 +130,83 @@ z =
z =
15
>> clear z % loesche die Variable z
>> clear z % deleting a variable
\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.
Note: in lines 2 and 6 the values of the variables have been used
without changing their values. Whenever the value of a variable should
change, the \code[Operator!Assignment!=]{=} operator has to be used
(lines 14 and 18). Line 23, finally shows how to delete a variable.
\subsection{Datentypen}
\subsection{Data types}
Der Datentyp bestimmt, wie die im Speicher abgelegten Bitmuster
interpretiert werden. Die wichtigsten Datentpyen sind:
As mentioned above, the data type associated with a variable defines how the stored bit pattern is interpreted. The major data types are:
\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
\item \codeterm{integer}: Integer numbers. There are several subtypes
which, for most use-cases, can be ignored when working in \matlab{}.
\item \codeterm{double}: Floating point numbers. In contrast to the
real numbers that are represented with this data type the number of
numeric values that can be represented is limited (countable?).
\item \codeterm{complex}: Complex numbers having a real and imaginary
part.
\item \codeterm{logical}: Boolean values that can be evaluated to
\code{true} or \code{false}.
\item \codeterm{char}: ASCII characters.
\end{itemize}
Unter den numerischen Datentypen gibt es verschiedene Arten mit
unterschiedlichem Speicherbedarf und Wertebreich (siehe
Tabelle~\ref{dtypestab}).
There is a variety of numeric data types that require different memory
demands and ranges of representable values (table~\ref{dtypestab}).
\begin{table}[t]
\centering
\titlecaption{Grundlegende numerische Datentypen und ihr Wertebereich.}{}
\titlecaption{Numeric data types and their ranges.}{}
\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
Data type & memory demand & range & example \erh \\ \hline
\code{double} & 64 bit & $\approx -10^{308}$ to $\approx 10^{308}
$& Floating point numbers.\erb\\ \code{int} & 64 bit & $-2^{31}$
to $2^{31}-1$ & Integer values. \\ \code{int16} & 16 bit &
$-2^{15}$ to $2^{15}-1$ & Digitizes measurements. \\ \code{uint8}
& 8 bit & $0$ bis $255$ & Digitized intensities of colors in
images. \\ \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}
By default \matlab{} uses the \codeterm{double} data type whenever
numerical values have to be stored. Nevertheless there are use-cases
in which different data types are better suited. Box~\ref{daqbox}
exemplifies such a case.
\begin{ibox}[t]{\label{daqbox}Digitizing measurements}
Scenario: The electric activity (e.g. the membrane potential) of a
nerve cell is recorded. The measurements are digitized and stored on
the hard disk of a computer for later analysis. This is done using a
Data Acquisition system (DAQ) that converts the analog measurements
into computer digestible digital format. Typically these systems
have a working range of $\pm 10$\,V. This range is usually resolved
with a precision of 16 bit. This means that the full potential range
is mapped onto $2^{16}$ digital values.\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:
Mapping of the potential range onto a \code{int16} data type:
\[ y = x \cdot 2^{16}/20\] with $x$ being the measured potential and $y$
the digitized value at a potential range of $\pm10$\,V and a
resolution of 16 bit. Resulting values are integer numbers in the
range $-2^{15}=-32768$ to $2^{15}-1 = 32767$.
The measured potential can be calculated from the digitized value
by inverting the equation:
\[ 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.
In this context it is most efficient to store the measured values as
\code{int16} instead of \code{double} numbers. Storing floating
point numbers requires four times more memory (8 instead of 2
\codeterm{Byte}, 64 instead of 16 bit) and offers no additional
information.
\end{ibox}