Merge branch 'master' of whale.am28.uni-tuebingen.de:scientificComputing
This commit is contained in:
commit
04151d237d
@ -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{Error messages}
|
\section{Debugging strategies}
|
||||||
|
|
||||||
|
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}
|
\begin{enumerate}
|
||||||
|
\item Lean back and take a breath.
|
||||||
|
\item Read the error messages and identify the position in the code
|
||||||
\end{ibox}
|
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}
|
|
||||||
|
|
||||||
|
|
||||||
\begin{lstlisting}[label=chaoticcode, caption={Un\"ubersichtliche Implementation des Random-walk.}]
|
When stopped in the debugger we can view and change the state of the
|
||||||
|
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}
|
|
||||||
|
BIN
debugging/lecture/figures/editor_debugger.png
Normal file
BIN
debugging/lecture/figures/editor_debugger.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 508 KiB |
@ -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}
|
||||||
|
|
||||||
|
229
programming/exercises/matrices.tex
Normal file
229
programming/exercises/matrices.tex
Normal 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}
|
@ -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}
|
||||||
|
200
programming/exercises/vectors.tex
Normal file
200
programming/exercises/vectors.tex
Normal 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}
|
@ -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
|
\begin{solution}
|
||||||
bedeutet die Fehlermeldung?
|
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}
|
\begin{solution}
|
||||||
\code{M(1:2,1) = [1, 2,3];\\ Subscripted assignment dimension
|
\code{z = x .* y;}
|
||||||
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{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}
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||||
\chapter{Programming in \matlab}
|
\chapter{Programming in \matlab}\label{programming}
|
||||||
|
|
||||||
\section{Variables and data types}
|
\section{Variables and data types}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user