Merge branch 'master' of whale.am28.uni-tuebingen.de:scientificComputing

This commit is contained in:
Jan Grewe 2017-10-24 17:26:30 +02:00
commit 04151d237d
8 changed files with 724 additions and 502 deletions

View File

@ -18,21 +18,20 @@ some hints that help to minimize errors.
\section{Types of errors and error messages} \section{Types of errors and error messages}
There are a number of different classes of programming errors and it There are a number of different classes of programming errors and it
is good to know the common ones. When we make a programming error is good to know the common ones. Some of your programming errors will
there are some that will lead to corrupted syntax, or invalid will lead to violations of the syntax or to invalid operations that
operations and \matlab{} will \codeterm{throw} an error. Throwing an will cause \matlab{} to \codeterm{throw} an error. Throwing an error
error ends the execution of a program and there will be an error ends the execution of a program and there will be an error messages
messages shown in the command window. With such messages \matlab{} shown in the command window. With such messages \matlab{} tries to
tries to explain what went wrong and provide a hint on the possible explain what went wrong and to provide a hint on the possible cause.
cause.
Bugs that lead to the termination of the execution may be annoying but Bugs that lead to the termination of the execution may be annoying but
are generally easier to find and fix than logical errors that stay are generally easier to find and to fix than logical errors that stay
hidden and the results of, e.g. an analysis, are seemingly correct. hidden and the results of, e.g. an analysis, are seemingly correct.
\begin{important}[Try --- catch] \begin{important}[Try --- catch]
There are ways to \codeterm{catch} errors during \codeterm{runtime} There are ways to \codeterm{catch} errors during \codeterm{runtime}
(i.e. when the program is executed) and handle them in the program. (i.e. when the program is executed) and handle them in the program.
\begin{lstlisting}[label=trycatch, caption={Try catch clause}] \begin{lstlisting}[label=trycatch, caption={Try catch clause}]
try try
@ -50,12 +49,12 @@ obscure logical errors! Take care when using the \codeterm{try-catch
\end{important} \end{important}
\subsection{\codeterm{Syntax error}} \subsection{\codeterm{Syntax errors}}\label{syntax_error}
The most common and easiest to fix type of error. A syntax error The most common and easiest to fix type of error. A syntax error
violates the rules (spelling and grammar) of the programming violates the rules (spelling and grammar) of the programming
language. For example every opening parenthesis must be matched by a language. For example every opening parenthesis must be matched by a
closing one or every \keyword{for} loop has to be closed by an closing one or every \code{for} loop has to be closed by an
\keyword{end}. Usually, the respective error messages are clear and \code{end}. Usually, the respective error messages are clear and
the editor will point out and highlight most \codeterm{syntax error}s. the editor will point out and highlight most \codeterm{syntax error}s.
\begin{lstlisting}[label=syntaxerror, caption={Unbalanced parenthesis error.}] \begin{lstlisting}[label=syntaxerror, caption={Unbalanced parenthesis error.}]
@ -67,7 +66,7 @@ Did you mean:
>> mean(random_numbers) >> mean(random_numbers)
\end{lstlisting} \end{lstlisting}
\subsection{\codeterm{Indexing error}} \subsection{\codeterm{Indexing error}}\label{index_error}
Second on the list of common errors are the indexing errors. Usually Second on the list of common errors are the indexing errors. Usually
\matlab{} gives rather precise infromation about the cause, once you \matlab{} gives rather precise infromation about the cause, once you
know what they mean. Consider the following code. know what they mean. Consider the following code.
@ -96,27 +95,80 @@ ans =
65 % wtf ?!? 65 % wtf ?!?
\end{lstlisting} \end{lstlisting}
The first two indexing attempts in listing \ref{indexerror_listing} The first two indexing attempts in listing \ref{indexerror} are rather
are rather clear. We are trying to access elements with indices that clear. We are trying to access elements with indices that are
are invalid. Remember, indices in \matlab{} start with 1. Negative invalid. Remember, indices in \matlab{} start with 1. Negative numbers
numbers and zero are not permitted. In the third attemp we index and zero are not permitted. In the third attemp we index using a
using a floating point number. This fails because indices have to be floating point number. This fails because indices have to be 'integer'
'integer' values. Using a character as an index (fourth attempt) values. Using a character as an index (fourth attempt) leads to a
leads to a different error message that says that the index exceeds different error message that says that the index exceeds the matrix
the matrix dimensions. This indicates that we are trying to read data dimensions. This indicates that we are trying to read data behind the
behind the length of our variable \codevar{my\_array} which has 100 length of our variable \varcode{my\_array} which has 100 elements.
elements.
One could have expected that the character is an invalid index, but One could have expected that the character is an invalid index, but
apparently it is valid but simply too large. The fith attempt apparently it is valid but simply too large. The fith attempt finally
finally succeeds. But why? \matlab{} implicitely converts the succeeds. But why? \matlab{} implicitely converts the \codeterm{char}
\codeterm{char} to a number and uses this number to address the to a number and uses this number to address the element in
element in \varcode{my\_array}. \varcode{my\_array}. The \codeterm{char} has the ASCII code 65 and
thus the 65th element of \varcode{my\_array} is returned.
\subsection{\codeterm{Assignment error}} \subsection{\codeterm{Assignment error}}
This error occurs when we want to write data into a vector. Related to the Indexing error this error occurs when we want to write
data into a variable, that does not fit into it. Listing
\ref{assignmenterror} shows the simple case for 1-d data but, of
course, it extents to n-dimensional data. The data that is to be
filled into a matrix hat to fit in all dimensions. The command in line
7 works due to the fact, that matlab automatically extends the matrix,
if you assign values to a range outside its bounds.
\begin{lstlisting}[label=assignmenterror, caption={Assignment errors.}]
>> a = zeros(1, 100);
>> b = 0:10;
>> a(1:10) = b;
In an assignment A(:) = B, the number of elements in A and B must be the same.
>> a(100:110) = b;
>> size(a)
ans =
110 1
\end{lstlisting}
\subsection{\codeterm{Dimension mismatch error}}
Similarly, some arithmetic operations are only valid if the variables
fulfill some size constraints. Consider the following commands
(listing\,\ref{dimensionmismatch}). The first one (line 3) fails
because we are trying to do al elementwise add on two vectors that
have different lengths, respectively sizes. The matrix multiplication
in line 6 also fails since for this operations to succeed the inner
matrix dimensions must agree (for more information on the
matrixmultiplication see box\,\ref{matrixmultiplication} in
chapter\,\ref{programming}). The elementwise multiplication issued in
line 10 fails for the same reason as the addition we tried
earlier. Sometimes, however, things apparently work but the result may
be surprising. The last operation in listing\,\ref{dimensionmismatch}
does not throw an error but the result is something else than the
expected elementwise multiplication.
\begin{lstlisting}[label=dimensionmismatch, caption={Some arithmetic operations make size constraints, violating them leads to dimension mismatch errors.}]
>> a = randn(100, 1);
>> b = randn(10, 1);
>> a + b
Matrix dimensions must agree.
>> a * b % The matrix multiplication!
Error using *
Inner matrix dimensions must agree.
>> a .* b
Matrix dimensions must agree.
>> c = a .* b'; % works but the result may not be what you expected!
>> size(c)
ans =
100 10
\end{lstlisting}
\paragraph{Name error:}
\paragraph{Arithmetic error:}
\section{Logical error} \section{Logical error}
Sometimes a program runs smoothly and terminates without any Sometimes a program runs smoothly and terminates without any
@ -132,9 +184,7 @@ there are a few strategies that should help us.
\item Clean code: Structure your code that you can easily read \item Clean code: Structure your code that you can easily read
it. Comment, but only where necessary. Correctly indent your it. Comment, but only where necessary. Correctly indent your
code. Use descriptive variable and function names. code. Use descriptive variable and function names.
\item Keep it simple (below). \item Keep it simple.
\item Read error messages, try to understand what \matlab{} wants to
tell.
\item Use scripts and functions and call them from the command \item Use scripts and functions and call them from the command
line. \matlab{} can then provide you with more information. It will line. \matlab{} can then provide you with more information. It will
then point to the line where the error happens. then point to the line where the error happens.
@ -143,17 +193,20 @@ there are a few strategies that should help us.
\end{enumerate} \end{enumerate}
\subsection{Avoiding errors} \subsection{Avoiding errors --- Keep it small and simple}
It would be great if we could just sit down write a program, run it It would be great if we could just sit down write a program, run it
and be done. Most likely this will not happen. Rather, we will make and be done. Most likely this will not happen. Rather, we will make
mistakes and have to bebug the code. There are a few guidelines that mistakes and have to bebug the code. There are a few guidelines that
help to reduce the number of errors. help to reduce the number of errors.
\subsection{The Kiss principle: 'Keep it small and simple' or 'simple and stupid'}
\shortquote{Debugging time increases as a square of the program's \shortquote{Debugging time increases as a square of the program's
size.}{Chris Wenham} size.}{Chris Wenham}
\shortquote{Everyone knows that debugging is twice as hard as writing
a program in the first place. So if you're as clever as you can be
when you write it, how will you ever debug it?}{Brian Kernighan}
Break down your programming problems into small parts (functions) that Break down your programming problems into small parts (functions) that
do exactly one thing. This has already been discussed in the context do exactly one thing. This has already been discussed in the context
of writing scripts and functions. In parts this is just a matter of of writing scripts and functions. In parts this is just a matter of
@ -163,11 +216,6 @@ conflicts (same or similar names for variables) increases. Remembering
the meaning of a certain variable that was defined in the beginning of the meaning of a certain variable that was defined in the beginning of
the script is just hard. the script is just hard.
\shortquote{Everyone knows that debugging is twice as hard as writing
a program in the first place. So if you're as clever as you can be
when you write it, how will you ever debug it?}{Brian Kernighan}
Many tasks within an analysis can be squashed into a single line of Many tasks within an analysis can be squashed into a single line of
code. This saves some space in the file, reduces the effort of coming code. This saves some space in the file, reduces the effort of coming
up with variable names and simply looks so much more competent than a up with variable names and simply looks so much more competent than a
@ -198,125 +246,89 @@ less resources than the other? (iv) How much do you have to invest
into the development of the most elegant solution relative to its into the development of the most elegant solution relative to its
importance in the project? The decision is up to you. importance in the project? The decision is up to you.
\subsection{Read error messages carefully and call programs from the command line.}
\section{Debugging strategies}
\section{Error messages} If you find yourself in trouble you can apply a few strategies to
solve the problem.
\begin{ibox}[tp]{\label{stacktracebox}Stacktrace or Stack Traceback}
\end{ibox}
\begin{enumerate}
\item Lean back and take a breath.
\item Read the error messages and identify the position in the code
where the error happens. Unfortunately this is not always the line
or command that really introduced the bug. In some instances the
actual error hides a few lines above.
\item No idea what the error message is trying to say? Google it!
\item Read the program line by line and understand what each line is
doing.
\item Use \code{disp} to print out relevant information on the command
line and compare the output with your expectations. Do this step by
step and start at the beginning.
\item Use the \matlab{} debugger to stop execution of the code at a
specific line and proceed step by step. Be sceptical and test all
steps for correctness.
\item Call for help and explain the program to someone else. When you
do this start at the beginning and walk thorough the code line by
line. Often it is not necessary that the other person is a
programmer or exactly understands what is going on. Often it is the
own refelction on the probelem and the chosen approach that helps
finding the bug. (This is strategy is also known as \codeterm{Rubber
duck debugging}.
\end{enumerate}
Es hilft ungemein, wenn zusammengeh\"orige Skripte und Funktionen im
gleichen Ordner auf der Festplatte zu finden sind. Es bietet sich also
an, f\"ur jede Analyse einen eigenen Ordner anzulegen und in diesem
die zugeh\"origen \codeterm{m-files} abzulegen. Auf eine tiefere
Schachtelung in weitere Unterordner kann in der Regel verzichtet
werden. \matlab{} erzeugt einen ``MATLAB'' Ordner im eigenen
\file{Documents} (Linux) oder \file{Eigene Dokumente} (Windows)
Ordner. Es bietet sich an, diesen Ordner als Wurzelverzeichnis f\"ur
eigene Arbeiten zu verwenden. Nat\"urlich kann auch jeder andere Ort
gew\"ahlt werden. In dem Beispiel in \figref{fileorganizationfig} wird
innerhalb dieses Ordners f\"ur jedes Projekt ein eigener Unterordner
erstellt, in welchem wiederum f\"ur jedes Problem, jede Analyse ein
weiterer Unterodner erstellt wird. In diesen liegen sowohl die
ben\"otigten \codeterm{m-files} also auch die Resultate der Analyse
(Abbildungen, Daten-Dateien). Zu bemerken sind noch zwei weitere
Dinge. Im Projektordner existiert ein Skript (analysis.m), das dazu
gedacht ist, alle Analysen aufzurufen. Des Weiteren gibt es parallel
zu den Projektordnern einen \file{functions}-Ordner in dem Funktionen
liegen, die in mehr als einem Projekt oder einer Analyse gebraucht
werden.
\begin{figure}[tp] \subsection{Debugger}
\includegraphics[width=0.75\textwidth]{no_bug}
\titlecaption{\label{fileorganizationfig} M\"ogliche Organisation von The \matlab{} editor (figure\,\ref{editor_debugger}) supports
Programmcode im Dateisystem.}{ F\"ur jedes Projekt werden interactive debugging. Once you save a m-file in the editor and it
Unterordner f\"ur die einzelnen Analysen angelegt. Auf Ebene des passes the syntax check, i.e. the little box in the upper right corner
Projektes k\"onnte es ein Skript (hier ``analysis.m'') geben, of the editor window is green or orange, you can set on or several
welches alle Analysen in den Unterordnern anst\"o{\ss}t.} \codeterm{break point}s. When the porgram is executed by calling it
from the command line it will be stopped at the line with the
breakpoint. In the editor this is indicated by a green arrow. The
command line will change too to indicate that we are now stopped in
debug mode (listing\,\ref{debuggerlisting}).
\begin{figure}
\centering
\includegraphics[width=0.9\linewidth]{editor_debugger.png}
\caption{Screenshot of the \matlab{} m-file editor. Once a file is
saved and passes the syntax check the green indicator (top-right
corner of the editor window), a breakpoint can be set. Breakpoints
can bes set either using the dropdown menu on top or by clicking
the line number on the left margin. An active breakpoint is
indicated by a red dot.}\label{editor_debugger}
\end{figure} \end{figure}
\Section{Namensgebung von Funktionen und Skripten} \begin{lstlisting}[label=debuggerlisting, caption={Command line when the program execution was stopped in the debugger.}]
>> simplerandomwalk
\matlab{} sucht Funktionen und Skripte ausschlie{\ss}lich anhand des 6 for run = 1:num_runs
Namens. Dabei spielt die Gro{\ss}- und Kleinschreibung eine Rolle. Die K>>
beiden Dateien \file{test\_funktion.m} und \file{Test\_Funktion.m} \end{lstlisting}
zwei unterschiedliche Funktionen benennen k\"onnen. Diese Art der
Variation des Namens ist nat\"urlich nicht sinnvoll. Sie tr\"agt keine
Information \"uber den Unterschied der beiden Funktionen. Auch sagt
der Name nahezu nichts \"uber den Zweck der Funktion aus.
Die Namensgebung f\"allt mitunter nicht leicht --- manchmal ist es
sogar der schwierigste Aspekt des Programmierens! Ausdrucksstarke
Namen zu finden lohnt sich aber. Ausdrucksstark bedeutet, dass sich
aus dem Namen R\"uckschl\"usse auf den Zweck ziehen lassen sollte.
\begin{important}[Benennung von Funktionen und Skripten]
Die Namen von Funktionen und Skripten sollten m\"oglichst viel \"uber
die Funktionsweise oder den Zweck aussagen (\file{firingrates.m}
statt \file{uebung.m}). Gute Namen f\"ur Funktionen und Skripte sind
die beste Dokumentation.
\end{important}
In Namen verbietet \matlab{} verbietet Leerzeichen, Sonderzeichen und
Umlaute. Namen d\"urfen auch nicht mit Zahlen anfangen. Es mach f\"ur
die Namensgebung selbst keine weiteren Vorgaben. Allerdings folgt die
Benennung der in \matlab{} vordefinierten Funktionen gewissen Mustern:
\begin{itemize}
\item Namen werden immer klein geschrieben.
\item Es werden gerne Abk\"urzungen eingesetzt (z.B. \code{xcorr()}
f\"ur die Kreuzkorrelation oder \code{repmat()} f\"ur ``repeat matrix'')
\item Funktionen, die zwischen Formaten konvertieren sind immer nach
dem Muster ``format2format'' (z.B. \code{num2str()} f\"ur die
Konvertierung ``number to string'', Umwandlung eines numerischen
Wertes in einen Text) benannt.
\end{itemize}
\begin{important}[Benennung von Variablen]
Die Namen von Variablen sollten m\"oglichst viel \"uber ihren Inhalt
aussagen (\varcode{spike\_count} statt \varcode{x}). Gute Namen
f\"ur Variablen sind die beste Dokumentation.
\end{important}
When stopped in the debugger we can view and change the state of the
\begin{lstlisting}[label=chaoticcode, caption={Un\"ubersichtliche Implementation des Random-walk.}] program at this step and try the next steps etc. Beware, however that
the state of a variable can be altered or even deleted which might
affect the execution of the remaining code.
\end{lstlisting} The toolbar of the editor offers now a new set of tools for debugging:
\begin{enumerate}
\item \textbf{Continue} --- simply move on until the program terminates or the
execution reaches the next breakpoint.
\item \textbf{Step} --- Execute the next command and stop.
\item \textbf{Step in} --- If the next command is the execution of a
function step into it and stop at the first command.
\item \textbf{Step out} --- If the next command is a function call,
proceed until the called function returns, then stop.
\item \textbf{Run to cursor} --- Execute all statements up to the
current cursor position.
\item \textbf{Quit debugging} --- Immediately stop the debugging
session and stop the further code execution.
\end{enumerate}
\pagebreak[4] The debugger offers some more (advanced) features but the
functionality offered by the basic tools is often enough to debug the
\begin{lstlisting}[label=cleancode, caption={\"Ubersichtliche Implementation des Random-walk.}] code.
num_runs = 10;
max_steps = 1000;
positions = zeros(max_steps, num_runs);
for run = 1:num_runs
for step = 2:max_steps
x = randn(1);
if x < 0
positions(step, run) = positions(step-1, run) + 1;
elseif x > 0
positions(step, run) = positions(step-1, run) - 1;
end
end
end
\end{lstlisting}
% \begin{exercise}{logicalVector.m}{logicalVector.out}
% Erstelle einen Vektor \varcode{x} mit den Werten 0--10.
% \begin{enumerate}
% \item F\"uhre aus: \varcode{y = x < 5}
% \item Gib den Inhalt von \varcode{y} auf dem Bildschirm aus.
% \item Was ist der Datentyp von \varcode{y}?
% \item Gibt alle Elemente aus \varcode{x} zur\"uck, die kleiner als 5 sind.
% \end{enumerate}
% \pagebreak[4]
% \end{exercise}

Binary file not shown.

After

Width:  |  Height:  |  Size: 508 KiB

View File

@ -14,8 +14,7 @@
%%%%% text size %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%% text size %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\usepackage[left=20mm,right=20mm,top=25mm,bottom=25mm]{geometry} \usepackage[left=20mm,right=20mm,top=25mm,bottom=25mm]{geometry}
\pagestyle{headandfoot} \header{{\bfseries\large \"Ubung \pagestyle{headandfoot} \header{{\bfseries\large \"Ubung
3}}{{\bfseries\large Boolesche Ausdr\"ucke, logisches 3}}{{\bfseries\large Boolean Expressions and logical indexing}}{{\bfseries\large 24. Oktober, 2017}}
Indizieren}}{{\bfseries\large 31. Oktober, 2016}}
\firstpagefooter{Dr. Jan Grewe}{Phone: 29 74588}{Email: \firstpagefooter{Dr. Jan Grewe}{Phone: 29 74588}{Email:
jan.grewe@uni-tuebingen.de} \runningfooter{}{\thepage}{} jan.grewe@uni-tuebingen.de} \runningfooter{}{\thepage}{}
@ -31,25 +30,24 @@
\vspace*{-6.5ex} \vspace*{-6.5ex}
\begin{center} \begin{center}
\textbf{\Large Einf\"uhrung in die wissenschaftliche Datenverarbeitung}\\[1ex] \textbf{\Large Introduction to scientific computing}\\[1ex]
{\large Jan Grewe, Jan Benda}\\[-3ex] {\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} \\ Abteilung Neuroethologie \hfill --- \hfill Institut f\"ur Neurobiologie \hfill --- \hfill \includegraphics[width=0.28\textwidth]{UT_WBMW_Black_RGB} \\
\end{center} \end{center}
Die folgenden Aufgaben dienen der Wiederholung, \"Ubung und The exercises are meant for self-monitoring, revision of the lecture
Selbstkontrolle und sollten eigenst\"andig bearbeitet und gel\"ost topic. You should try to solve them on your own. Your solution should
werden. Die L\"osung soll in Form eines einzelnen Skriptes (m-files) be submitted as a single script (m-file) in the Ilias system. Each
im ILIAS hochgeladen werden. Jede Aufgabe sollte in einer eigenen task should be solved in its own ``cell''. Each cell must be
``Zelle'' gel\"ost sein. Die Zellen \textbf{m\"ussen} unabh\"angig executable on its own. The file should be named according to the following pattern:
voneinander ausf\"uhrbar sein. Das Skript sollte nach dem Muster:\newline ``variables\_datatypes\_\{lastname\}.m'' benannt werden
``boolesche\_ausdruecke\_\{nachname\}.m'' benannt werden (e.g. variables\_datentypes\_mueller.m).
(z.B. variablen\_datentypen\_mueller.m).
\section{Boolesche Ausdr\"ucke} \section{Boolean expressions}
\begin{questions} \begin{questions}
\question Gegeben sind zwei Vektoren \verb+x = [1 5 2 8 9 0 1]+ und \question Consider the following vectors \verb+x = [1 5 2 8 9 0 1]+ and
\verb+y = [5 2 2 6 0 0 2]+. F\"uhre aus und erkl\"are. \verb+y = [5 2 2 6 0 0 2]+. Execute the following commands and explain.
\begin{parts} \begin{parts}
\part \verb+x > y+ \part \verb+x > y+
\part \verb+y < x+ \part \verb+y < x+
@ -59,32 +57,29 @@ voneinander ausf\"uhrbar sein. Das Skript sollte nach dem Muster:\newline
\part \verb+x | y+ \part \verb+x | y+
\end{parts} \end{parts}
\question Finde heraus, was die Funktionen \verb+bitand+ und \verb+bitor+ machen. \question Find out what the functions \verb+bitand+ and \verb+bitor+ do.
\begin{parts} \begin{parts}
\part F\"uhre aus und erkl\"are: \verb+bitand(10, 8)+ \part Execute and explain: \verb+bitand(10, 8)+
\part F\"uhre aus und erkl\"are: \verb+bitor(10, 8)+ \part Execute and explain: \verb+bitor(10, 8)+
\end{parts} \end{parts}
\item Implementiere folgende Boolesche Ausdr\"ucke. Teste mit \item Implemen the following Boolean expressions. Test using randomly selected integer values for \verb+x+ and \verb+y+.
zuf\"alligen ganzzahlingen Werten f\"ur \verb+x+ und \verb+y+.
\begin{parts} \begin{parts}
\part Das Ergebnis sei wahr, wenn \verb+x+ gr\"o{\ss}er als \verb+y+ und die \part The result should be \verb+true+ if \verb+x+ greater than \verb+y+ and the sum of \verb+x+ and \verb+y+ is not less than 100.
Summe aus \verb+x+ und \verb+y+ nicht kleiner als 100 ist. \part The result shoudl be \verb+true+ if \verb+x+ and \verb+y+ are not equal zero or \verb+x+ and \verb+y+ are equal.
\part Das Ergebnis sei wahr, wenn \verb+x+ und \verb+y+ ungleich 0
oder \verb+x+ und \verb+y+ gleich sind.
\end{parts} \end{parts}
\end{questions} \end{questions}
\newpage \newpage
\section{Logische Indizierung} \section{Logical Indexing}
Boolesche Ausdr\"ucke k\"onnen benutzt werden um aus Vektoren und Boolean expressions can be used to select elements of vectors or
Matrizen die Elemente herauszusuchen, die einem bestimmeten Kriterium matrices that match in certain criteria. This process is called
entsprechen. logical indexing.
\begin{questions} \begin{questions}
\question Gegeben sind \verb+x = (1:10)+ und \question Given are the vectors \verb+x = (1:10)+ and
\verb+y = [3 1 5 6 8 2 9 4 7 0]+. Versuche die Ausgaben folgender \verb+y = [3 1 5 6 8 2 9 4 7 0]+. Try to understand the results of
Anweisungen zu verstehen. Erkl\"are die Ergebnisse. the following commands. Explain.
\begin{parts} \begin{parts}
\part \verb+x < 5+ \part \verb+x < 5+
\part \verb+x( x < 5) )+ \part \verb+x( x < 5) )+
@ -93,15 +88,11 @@ entsprechen.
\part \verb+x( (x == 0) & (y == 0) )+ \part \verb+x( (x == 0) & (y == 0) )+
\end{parts} \end{parts}
\question Teste den Zufallsgenerator: \question Test the random number generator:
\begin{parts} \begin{parts}
\part Erzeuge eine 100x100 2-D Matrize mit Zufallswerten zwischen \part Create a 100x100 2-D matrix that is filled with random numbers in the range 0 to 100 (\verb+randi+). Replace the elements according to these rules: \verb+x < 33+ to 0,
0 und 100 (\verb+randi+). Ersetze die Werte der Elemente, die in \verb+x >= 33 and x < 66+ to 1 and all \verb+x >= 66+ to 2.
folgende Klassen fallen: \verb+x < 33+ mit 0, \part Count the number of elements in each class using Boolean expressions (\verb+sum+ can be used to count the matches).
\verb+x >= 33 und x < 66+ mit 1 und alle \verb+x >= 66+ auf 2.
\part Ermittle die Anzahl Elemente f\"ur jede Klasse mithilfe eines
Booleschen Ausdrucks (\verb+sum+ kann eingesetzt werden um die
Anzahl Treffer zu ermitteln).
\end{parts} \end{parts}
\end{questions} \end{questions}

View File

@ -0,0 +1,229 @@
\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 Exercise 3}}{{\bfseries\large Matrices}}{{\bfseries\large 23. Oktober, 2017}}
\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{Solutions:}\par\noindent}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{document}
\vspace*{-6.5ex}
\begin{center}
\textbf{\Large Introduction to Scientific Computing}\\[1ex]
{\large Jan Grewe, Jan Benda}\\[-3ex]
Neuroethology \hfill --- \hfill Institute for Neurobiology \hfill --- \hfill \includegraphics[width=0.28\textwidth]{UT_WBMW_Black_RGB} \\
\end{center}
The exercises are meant for self-monitoring, revision of the lecture
topic. You should try to solve them on your own. Your solution should
be submitted as a single script (m-file) in the Ilias system. Each
task should be solved in its own ``cell''. Each cell must be
executable on its own. The file should be named according to the following pattern:
``variables\_datatypes\_\{lastname\}.m'' benannt werden
(e.g. variables\_datentypes\_mueller.m).
\begin{questions}
\question Create the following matrix:
\[ A = \left( \begin{array}{ccc} 7 & 3 & 5 \\ 1 & 8 & 3 \\ 8 & 6 &
4 \end{array} \right) \]
\begin{parts}
\part Use the function \code{size} to check for its size.
\begin{solution}
\code{x = [7 3 5; 1 8 3; 8 6 4];\\disp(size(x))}
\end{solution}
\part Use the help to figure out how to get only the size along a certain axis. Print the sizes of each dimension.
\begin{solution}
\code{disp(size(x, 1))}\\\code{disp(size(x, 2))}
\end{solution}
\part Retrieve the element at the position 3rd line, 2nd column.
\begin{solution}
\code{x(3,2)}
\end{solution}
\part Print all elements of the 1st, 2nd and 3rd line.
\begin{solution}
\code{disp(x([1 2 3],:));}
\end{solution}
\part Print all elements of the 1st, 2nd, and 3rd column.
\begin{solution}
\code{disp(x(:, 1))\\ disp(x(:, 2))\\ disp(x(:, 3))}
\end{solution}
\part Increment all elements of the 2nd line and the 3rd column about 1.
\begin{solution}
\code{x(2,3) = x(2,3) + 1;}
\end{solution}
\part Subtract five from all elements of the 1st line.
\begin{solution}
\code{x(1,:) = x(1,:) - 5;}
\end{solution}
\part Multiply all elements of the 3rd column with 2.
\begin{solution}
\code{x(:,3) = x(:,3) .* 2;}
\end{solution}
\end{parts}
\question Create a $5 \times 5$ matrix \code{M} that contains random numbers (use the function
\verb+randn()+. Use the help to find out what it does).
\begin{parts}
\part Print the element at the position 2nd line and 3rd column.
\begin{solution}
\code{M = randn(5, 5);}
\code{disp(M(2,3))}
\end{solution}
\part Print all elements of the 1st, 3rd and last line.
\begin{solution}
\code{disp(M(1,:)) \\ disp(M(3,:))\\ disp(M(size(M,1), :))}
\end{solution}
\part Print the elements of the 2nd and 4th column.
\begin{solution}
\code{disp(M(:,2))\\ disp(M(:,4))}
\end{solution}
\part Select with a single command all elements of every 2nd column and store them in a new variable.
\begin{solution}
\code{y = M(:, [2:2:size(M,2)])}
\end{solution}
\part Calculate the averages of lines 1, 3, and 5 (use the function mean, see help).
\begin{solution}
\code{mean(M([1 3 5],:), 2)}
\end{solution}
\part Calculate the sum of all elements in the 2nd and 4th column
(function \code{sum}, see help).
\begin{solution}
\code{sum(M(:, [2 4]), 1)}
\end{solution}
\part Calculate the total sum of all elements in \code{M}
\begin{solution}
\code{sum(M(:))}
\end{solution}
\part Exchange all elements of the 2nd with those of the 4th line.
\begin{solution}
\code{M(2,:) = M(4,:)}
\end{solution}
\part Execute the following command: \code{M(1:2,1) = [1, 2,
3]}. What could have been intended by the command and what does the error message tell?
\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 Indexing in matrices can use the
\textit{subscript} indices or the \textit{linear} indices (you may want to check the help for the \verb+sub2ind+ and \verb+ind2sub+).
\begin{parts}
\part Create a 2-D matric filled with random numbers and the dimensionality
\verb+[10,10]+.
\begin{solution}
\code{x = randn(10, 10)}
\end{solution}
\part How many elements are stored in it?
\begin{solution}
\code{disp(numel(x))}
\end{solution}
\part Employ linar indexing to select 50 random values.
\begin{solution}
\code{x(randi(100, 50, 1)])}
\end{solution}
\part Is there an advantage to use the linear indexing?
\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 Calculate the total sum of all elements with a single command.
\begin{solution}
\code{sum(x(:))} or \code{sum(sum(x))}
\end{solution}
\end{parts}
\question Create the three variables \verb+x = [1 5 9]+ and
\verb+y = [7 1 5]+ and \verb+M = [3 1 6; 5 2 7]+. Which of the following commands will pass? Which command will not? If not, why? Test your predictions.
\begin{parts}
\part \code{x + y}
\begin{solution}
works!
\end{solution}
\part \code{x * M}
\begin{solution}
Matrixmultiplication will not work! Inner dimensions must agree!
\end{solution}
\part \code{x + y'}
\begin{solution}
Fail! Dimensionalities do not match.
\end{solution}
\part \code{M - [x y]}
\begin{solution}
Fail! \code{[x y] is a line vector of length 6, M is a martix.}
\end{solution}
\part \code{[x; y]}
\begin{solution}
Works! Size: 2 3
\end{solution}
\part \code{M - [x; y]}
\begin{solution}
Works!
\end{solution}
\end{parts}
\question Create a 3-D matrix from two 2-D matrices. Use the function cat (check the help to learn its usage).
\begin{parts}
\part Select all elements of the first ``page'' (index 1, 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 Create a $5 \times 5 \times 5$ matrix of random numbers that have been drawn from a uniform distribution. Values should be in the range 0 and 100.
\begin{parts}
\part Calculate the average of each ``page'' (function \verb+mean()+, see help).
\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}

View File

@ -1,4 +1,4 @@
\documentclass[12pt,a4paper,pdftex]{exam} \documentclass[12pt,a4paper,pdftex, answers]{exam}
\usepackage[german]{babel} \usepackage[german]{babel}
\usepackage{natbib} \usepackage{natbib}

View File

@ -0,0 +1,200 @@
\documentclass[12pt,a4paper,pdftex, answers]{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 Exercise 2}}{{\bfseries\large Vectors}}{{\bfseries\large 18. Oktober, 2017}}
\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{Solutions:}\par\noindent}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{document}
\vspace*{-6.5ex}
\begin{center}
\textbf{\Large Introduction to Scientific Computing}\\[1ex]
{\large Jan Grewe, Jan Benda}\\[-3ex]
Neuroethology \hfill --- \hfill Institute for Neurobiology \hfill --- \hfill \includegraphics[width=0.28\textwidth]{UT_WBMW_Black_RGB} \\
\end{center}
The exercises are meant for self-monitoring and revision of the lecture
topic. You should try to solve them on your own. Your solution should
be submitted as a single script (m-file) in the Ilias system. Each
task should be solved in its own ``cell''. Each cell must be
executable on its own. The file should be named according to the following pattern:
``variables\_datatypes\_\{lastname\}.m'' benannt werden
(e.g. variables\_datentypes\_mueller.m).
\begin{questions}
\question Create vector with the following contents:
\begin{parts}
\part Integer numbers ranging from 1 to 10.
\begin{solution}
\code{a = 1:10;}
\end{solution}
\part Integer numbers in the range 0 to 20 in steps of 2.
\begin{solution}
\code{a = 0:2:20;}
\end{solution}
\part \textbf{Descending} values ranging from 100 to 0.
\begin{solution}
\code{a = 100:-1:0;}
\end{solution}
\part In 10 steps from 0 to 1.
\begin{solution}
\code{a = 0:0.1:1;}
\end{solution}
\part In 11 steps from 0 to 1.
\begin{solution}
\code{a = 0:1/11:1;}
\end{solution}
\part In 50 steps from 0 to $2\pi$ ($\pi$ is known in Matlab as the constant
\code{pi}).
\begin{solution}
\code{a = 0:2*pi/50:2*pi;}
\end{solution}
\end{parts}
\question Calculations with vectors:
\begin{parts}
\part Create a vector \code{x = [3 2 6 8];}
\part What is the size of this vector? Use the functions \code{size} and \code{length}. What is the difference between them?
\begin{solution}
\code{x = [3 2 6 8];
\\ disp(length(x));\\ 4\\ disp(size(x))\\ 1 4}
\end{solution}
\part What changes in \code{size} and \code{length} when you transpose the vector.
\begin{solution}
The length does not change, the size is inverted.
\end{solution}
\part Add 5 to each element of \verb+x+.
\begin{solution}
\code{disp(x + 5)}
\end{solution}
\part Multiply each element of \code{x} with 2;
\begin{solution}
\code{disp(x * 2)}
\end{solution}
\part Create a second vector (\verb+y = [4 1 3 5];+).
Make sure that \code{x} is in its original form.
\part Add both vectors \code{x + y}.
\begin{solution}
\code{y = [4 1 3 5]; \\disp(x + y)\\7 3 9 13}
\end{solution}
\part Subtract \code{y} from \code{x}.
\begin{solution}
\code{disp(x - y)\\-1 1 3 3}
\end{solution}
\part Multiply both vectors \code{x * y}.
\begin{solution}
\code{disp(x * y)\\Error using *. Inner matrix dimension must agree.}
\end{solution}
\part Explain the error message
\begin{solution}
* operator is the matrix multiplication. The inner dimensions must agree.\linebreak
\code{disp(size(x))\\1 4 \\disp(size(y)) \\ 1 4}\\
(m,n)*(n,o) w\"are ok.
\end{solution}
\part What needs to be done to make \code{mtimes} and
\code{*} working?
\begin{solution}
y needs to be transposed: \code{x * y'}
\end{solution}
\part Multiply element-wise (\code{x .* y}) and assign the result to a new variable.
\begin{solution}
\code{z = x .* y;}
\end{solution}
\end{parts}
\question Creating vectors using helper functions:
\begin{parts}
\part Create a vector of the length 100 using the function
\code{ones} (see help). What is its purpose?
\begin{solution}
\code{ones(100,1)} creates a vector of the given size and fills it with 1.
\end{solution}
\part Create a vector of the length 100 using the function
\code{zeros} (see help). What is its purpose?
\begin{solution}
\code{zeros(100,1)} creates a vector of the given size and fills it with 0.
\end{solution}
\part Create a vector with 100 elements. All elements should have the value
4.5.
\begin{solution}
\code{ones(100, 1) * 4.5}
\end{solution}
\part Create a 100 element vector filled with random numbers (\code{rand},
see help).
\begin{solution}
\code{x = rand(100, 1)}
\end{solution}
\part Use the function \code{linspace} to create a 100 element vector with values between 0 and 1.
\begin{solution}
\code{x = linspace(0, 1, 100)}
\end{solution}
\end{parts}
\question Indexing in vectors:
\begin{parts}
\part Create a 100 element length vector with values ranging from 0 to 99.
\begin{solution}
\code{x = linspace(0, 99, 100);}
\end{solution}
\part Print the first, last, fifth, 24th and the second-to-last value.
\begin{solution}
\code{disp(x(1))\\ disp(x(end))\\ disp(x(5))\\ disp(x(24))\\ disp(x(end-1))}
\end{solution}
\part Print the first 10 values.
\begin{solution}
\code{x(1:10)}
\end{solution}
\part Print the last 10 values.
\begin{solution}
\code{disp(x(end-9:end))}
\end{solution}
\part Try to print the value at the zeroth position.
\begin{solution}
\code{x(0)\\ Subscript indices must either be real positive integers or logicals.}
\end{solution}
\part Try to access the value at the 110th position.
\begin{solution}
\code{x(110)\\ Index exceeds matrix dimensions.}
\end{solution}
\part Access the values at the positions 3, 15, and 42 with a single command.
\begin{solution}
\code{disp(x([3 15 42]))}
\end{solution}
\part Access 10 randomly selected values (used \verb+randi+ to create random indices).
\begin{solution}
\code{x(randi(100,10,1))}
\end{solution}
\end{parts}
\question Store some text in a valriable. The text should consist of at least two words (e.g. \code{x = 'some
text'}). Use indexing to print out the words individually.
\begin{solution}
\code{x = 'some text'; \\ disp(x(1:4))\\disp(x(6:end))}
\end{solution}
\end{questions}
\end{document}

View File

@ -1,4 +1,4 @@
\documentclass[12pt,a4paper,pdftex]{exam} \documentclass[12pt,a4paper,pdftex, answers]{exam}
\usepackage[german]{babel} \usepackage[german]{babel}
\usepackage{natbib} \usepackage{natbib}
@ -13,10 +13,11 @@
%%%%% text size %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%% text size %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\usepackage[left=20mm,right=20mm,top=25mm,bottom=25mm]{geometry} \usepackage[left=20mm,right=20mm,top=25mm,bottom=25mm]{geometry}
\pagestyle{headandfoot} \header{{\bfseries\large \"Ubung \pagestyle{headandfoot}
2}}{{\bfseries\large Vektoren und Matrizen}}{{\bfseries\large 12. Oktober, 2015}} \header{{\bfseries\large Exercise 2}}{{\bfseries\large Vectors}}{{\bfseries\large 18. Oktober, 2017}}
\firstpagefooter{Dr. Jan Grewe}{Phone: 29 74588}{Email: \firstpagefooter{Dr. Jan Grewe}{Phone: 29 74588}{Email:
jan.grewe@uni-tuebingen.de} \runningfooter{}{\thepage}{} jan.grewe@uni-tuebingen.de}
\runningfooter{}{\thepage}{}
\setlength{\baselineskip}{15pt} \setlength{\baselineskip}{15pt}
\setlength{\parindent}{0.0cm} \setlength{\parindent}{0.0cm}
@ -24,387 +25,176 @@
\renewcommand{\baselinestretch}{1.15} \renewcommand{\baselinestretch}{1.15}
\newcommand{\code}[1]{\texttt{#1}} \newcommand{\code}[1]{\texttt{#1}}
\renewcommand{\solutiontitle}{\noindent\textbf{L\"osung:}\par\noindent} \renewcommand{\solutiontitle}{\noindent\textbf{Solutions:}\par\noindent}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{document} \begin{document}
\vspace*{-6.5ex} \vspace*{-6.5ex}
\begin{center} \begin{center}
\textbf{\Large Einf\"uhrung in die wissenschaftliche Datenverarbeitung}\\[1ex] \textbf{\Large Introduction to Scientific Computing}\\[1ex]
{\large Jan Grewe, Jan Benda}\\[-3ex] {\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} \\ Neuroethology \hfill --- \hfill Institute for Neurobiology \hfill --- \hfill \includegraphics[width=0.28\textwidth]{UT_WBMW_Black_RGB} \\
\end{center} \end{center}
Die folgenden Aufgaben dienen der Wiederholung, \"Ubung und The exercises are meant for self-monitoring and revision of the lecture
Selbstkontrolle und sollten eigenst\"andig bearbeitet und gel\"ost topic. You should try to solve them on your own. Your solution should
werden. Die L\"osung soll in Form eines einzelnen Skriptes (m-files) be submitted as a single script (m-file) in the Ilias system. Each
im ILIAS hochgeladen werden. Jede Aufgabe sollte in einer eigenen task should be solved in its own ``cell''. Each cell must be
``Zelle'' gel\"ost sein. Die Zellen \textbf{m\"ussen} unabh\"angig executable on its own. The file should be named according to the following pattern:
voneinander ausf\"uhrbar sein. Das Skript sollte nach dem Muster: ``variables\_datatypes\_\{lastname\}.m'' benannt werden
\linebreak ``vektoren\_matrizen\_\{nachname\}.m'' benannt werden (e.g. variables\_datentypes\_mueller.m).
(z.B. vektoren\_matrizen\_mueller.m).
\begin{questions} \begin{questions}
\section*{Vektoren} \question Create vector with the following contents:
\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} \begin{parts}
\part Benutze die Funktion \code{size} um die Gr\"o{\ss}e vpm \code{A} anzeeigen zu lassen. \part Integer numbers ranging from 1 to 10.
\begin{solution} \begin{solution}
\code{x = [7 3 5; 1 8 3; 8 6 4];\\disp(size(x))} \code{a = 1:10;}
\end{solution} \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. \part Integer numbers in the range 0 to 20 in steps of 2.
\begin{solution} \begin{solution}
\code{disp(size(x, 1))}\\\code{disp(size(x, 2))} \code{a = 0:2:20;}
\end{solution} \end{solution}
\part Gib das Element in der 3. Zeile und 2. Spalte aus. \part \textbf{Descending} values ranging from 100 to 0.
\begin{solution} \begin{solution}
\code{x(3,2)} \code{a = 100:-1:0;}
\end{solution} \end{solution}
\part Gib jeweils alle Elemente der 1., 2. und 3. Zeile aus. \part In 10 steps from 0 to 1.
\begin{solution} \begin{solution}
\code{disp(x([1 2 3],:));} \code{a = 0:0.1:1;}
\end{solution} \end{solution}
\part Gib jeweils alle Elemente der 1., 2., und 3. Spalte aus. \part In 11 steps from 0 to 1.
\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} \begin{solution}
\code{x(1,:) = x(1,:) - 5;} \code{a = 0:1/11:1;}
\end{solution} \end{solution}
\part Multipliziere alle Elementen der 3. Spalte mit 2. \part In 50 steps from 0 to $2\pi$ ($\pi$ is known in Matlab as the constant
\code{pi}).
\begin{solution} \begin{solution}
\code{x(:,3) = x(:,3) * 2;} \code{a = 0:2*pi/50:2*pi;}
\end{solution} \end{solution}
\end{parts} \end{parts}
\question Erstelle eine $5 \times 5$ Matrix \code{M} die \question Calculations with vectors:
Zufallszahlen enth\"alt (nutze die MATLAB Funktion
\verb+randn()+. Benutze die Hilfe: Was macht die Funktion?).
\begin{parts} \begin{parts}
\part Gib das Element in der 2. Zeile und 3. Spalte aus. \part Create a vector \code{x = [3 2 6 8];}
\part What is the size of this vector? Use the functions \code{size} and \code{length}. What is the difference between them?
\begin{solution} \begin{solution}
\code{M = randn(5, 5);} \code{x = [3 2 6 8];
\code{disp(M(2,3))} \\ disp(length(x));\\ 4\\ disp(size(x))\\ 1 4}
\end{solution} \end{solution}
\part What changes in \code{size} and \code{length} when you transpose the vector.
\part Gib jeweils alle Elemente der 1., 3. und letzten Zeile aus.
\begin{solution} \begin{solution}
\code{disp(M(1,:)) \\ disp(M(3,:))\\ disp(M(size(M,1), :))} The length does not change, the size is inverted.
\end{solution} \end{solution}
\part Add 5 to each element of \verb+x+.
\part Gib jeweils alle Elemente der 2. und 4. Spalte aus.
\begin{solution} \begin{solution}
\code{disp(M(:,2))\\ disp(M(:,4))} \code{disp(x + 5)}
\end{solution} \end{solution}
\part Multiply each element of \code{x} with 2;
\part Greife mit einem einzigen Kommando auf die Elemente jeder
zweiten Spalte zu und speichere die Daten in einer neuen Variable.
\begin{solution} \begin{solution}
\code{y = M(:, [2:2:size(M,2)])} \code{disp(x * 2)}
\end{solution} \end{solution}
\part Create a second vector (\verb+y = [4 1 3 5];+).
\part Berechne jeweils den Mittelwert der 1., 3. und 5. Zeile Make sure that \code{x} is in its original form.
(Funktion \code{mean}, siehe Hilfe). \part Add both vectors \code{x + y}.
\begin{solution} \begin{solution}
\code{mean(M([1 3 5],:), 2)} \code{y = [4 1 3 5]; \\disp(x + y)\\7 3 9 13}
\end{solution} \end{solution}
\part Subtract \code{y} from \code{x}.
\part Berechne die Summe aller Werte der 2. und 4. Spalte
(Funktion \code{sum}, siehe Hilfe).
\begin{solution} \begin{solution}
\code{sum(M(:, [2 4]), 1)} \code{disp(x - y)\\-1 1 3 3}
\end{solution} \end{solution}
\part Multiply both vectors \code{x * y}.
\part Berechne die Summe aller Elemente der Matrize.
\begin{solution} \begin{solution}
\code{sum(M(:))} \code{disp(x * y)\\Error using *. Inner matrix dimension must agree.}
\end{solution} \end{solution}
\part Explain the error message
\part Ersetze die Elemente der 2. Zeile mit denen der 4.
\begin{solution} \begin{solution}
\code{M(2,:) = M(4,:)} * operator is the matrix multiplication. The inner dimensions must agree.\linebreak
\code{disp(size(x))\\1 4 \\disp(size(y)) \\ 1 4}\\
(m,n)*(n,o) w\"are ok.
\end{solution} \end{solution}
\part What needs to be done to make \code{mtimes} and
\part F\"uhre folgendes Kommando aus: \code{M(1:2,1) = [1, 2, \code{*} working?
3]}. Was k\"onnte die Absicht dieses Codes gewesen sein? Was
bedeutet die Fehlermeldung?
\begin{solution} \begin{solution}
\code{M(1:2,1) = [1, 2,3];\\ Subscripted assignment dimension y needs to be transposed: \code{x * y'}
mismatch.} \\ Der einzuf\"ugende Vektor hat 3 Elemente, die \end{solution}
Auswahl von M in die geschrieben werden soll hat nur die \part Multiply element-wise (\code{x .* y}) and assign the result to a new variable.
Gr\"o{\ss}e 2; \begin{solution}
\code{z = x .* y;}
\end{solution} \end{solution}
\end{parts} \end{parts}
\question Matrizen k\"onnen neben der ``normalen'' \question Creating vectors using helper functions:
\textit{subscript} Indizierung auch \textit{linear} indiziert werden
(siehe Hilfe \"uber Indexing oder Funktionen \verb+sub2ind+ oder
\verb+ind2sub+).
\begin{parts} \begin{parts}
\part Erstelle eine 2-D Matrix mit Zufallszahlen mit der Dimensionalit\"at \part Create a vector of the length 100 using the function
\verb+[10,10]+. \code{ones} (see help). What is its purpose?
\begin{solution} \begin{solution}
\code{x = randn(10, 10)} \code{ones(100,1)} creates a vector of the given size and fills it with 1.
\end{solution} \end{solution}
\part Create a vector of the length 100 using the function
\part Wie viele Werte enth\"alt sie? \code{zeros} (see help). What is its purpose?
\begin{solution} \begin{solution}
\code{disp(numel(x))} \code{zeros(100,1)} creates a vector of the given size and fills it with 0.
\end{solution} \end{solution}
\part Create a vector with 100 elements. All elements should have the value
\part Benutze das lineare Indizieren um 50 zuf\"allige Werte 4.5.
auszuw\"ahlen.
\begin{solution} \begin{solution}
\code{x(randi(100, 50, 1)])} \code{ones(100, 1) * 4.5}
\end{solution} \end{solution}
\part Create a 100 element vector filled with random numbers (\code{rand},
\part Wo liegt der Vorteil gegen\"uber der \textit{subscript} see help).
Indizierung?
\begin{solution} \begin{solution}
Die Matrize ist 2-dimensional. Wenn mit dem subscript index \code{x = rand(100, 1)}
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} \end{solution}
\part Berechne die Summe aller Werte mit einem Funktionsaufruf.. \part Use the function \code{linspace} to create a 100 element vector with values between 0 and 1.
\begin{solution} \begin{solution}
\code{sum(x(:))} oder \code{sum(sum(x))} \code{x = linspace(0, 1, 100)}
\end{solution} \end{solution}
\end{parts} \end{parts}
\question Erstelle folgende Variablen \verb+x = [1 5 9]+ and \question Indexing in vectors:
\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} \begin{parts}
\part \code{x + y} \part Create a 100 element length vector with values ranging from 0 to 99.
\begin{solution} \begin{solution}
Funktioniert! \code{x = linspace(0, 99, 100);}
\end{solution} \end{solution}
\part Print the first, last, fifth, 24th and the second-to-last value.
\part \code{x * M}
\begin{solution} \begin{solution}
Matrixmultiplikation Funktioniert nicht! Inner dimensions must agree! \code{disp(x(1))\\ disp(x(end))\\ disp(x(5))\\ disp(x(24))\\ disp(x(end-1))}
\end{solution} \end{solution}
\part Print the first 10 values.
\part \code{x + y'}
\begin{solution} \begin{solution}
Funktioniert nicht! Die Dimensionalit\"aten passen nicht. \code{x(1:10)}
\end{solution} \end{solution}
\part Print the last 10 values.
\part \code{M - [x y]}
\begin{solution} \begin{solution}
Funktioniert nicht! \code{[x y] ist ein Zeilenvektor der L\"ange \code{disp(x(end-9:end))}
6, M ist eine Martix.}
\end{solution} \end{solution}
\part Try to print the value at the zeroth position.
\part \code{[x; y]}
\begin{solution} \begin{solution}
Funktioniert! Gr\"o{\ss}e: 2 3 \code{x(0)\\ Subscript indices must either be real positive integers or logicals.}
\end{solution} \end{solution}
\part Try to access the value at the 110th position.
\part \code{M - [x; y]}
\begin{solution} \begin{solution}
Funktioniert! \code{x(110)\\ Index exceeds matrix dimensions.}
\end{solution} \end{solution}
\end{parts} \part Access the values at the positions 3, 15, and 42 with a single command.
\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} \begin{solution}
\code{x = randn(5,5); \\y = randn(5, 5);\\ z = cat(3, x, y);\\disp(z(:,:,1))} \code{disp(x([3 15 42]))}
\end{solution} \end{solution}
\end{parts} \part Access 10 randomly selected values (used \verb+randi+ to create random indices).
\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} \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))))} \code{x(randi(100,10,1))}
\end{solution} \end{solution}
\end{parts} \end{parts}
\end{questions}
\question Store some text in a valriable. The text should consist of at least two words (e.g. \code{x = 'some
text'}). Use indexing to print out the words individually.
\begin{solution}
\code{x = 'some text'; \\ disp(x(1:4))\\disp(x(6:end))}
\end{solution}
\end{questions}
\end{document} \end{document}

View File

@ -1,6 +1,6 @@
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\chapter{Programming in \matlab} \chapter{Programming in \matlab}\label{programming}
\section{Variables and data types} \section{Variables and data types}