From 3d4d778bdd0932a3d651155c7891961b30f730fc Mon Sep 17 00:00:00 2001 From: Jan Benda Date: Sun, 22 Nov 2015 12:47:05 +0100 Subject: [PATCH 01/17] Fixed severla error messages. New \varcode macro for code without index. --- Makefile | 12 ++-- bootstrap/lecture/bootstrap-chapter.tex | 2 +- header.tex | 22 +++++--- likelihood/lecture/likelihood-chapter.tex | 2 +- plotting/lecture/plotting.tex | 18 +++--- .../lecture/pointprocesses-chapter.tex | 4 +- .../lecture/pointprocessscetchA.eps | 6 +- .../lecture/pointprocessscetchA.pdf | Bin 2769 -> 2765 bytes .../lecture/pointprocessscetchB.eps | 6 +- .../lecture/pointprocessscetchB.pdf | Bin 4677 -> 4673 bytes programming/lecture/programming.tex | 52 +++++++++--------- .../lecture/programmingstyle-chapter.tex | 2 +- programmingstyle/lecture/programmingstyle.tex | 6 +- regression/lecture/regression-chapter.tex | 2 +- scientificcomputing-script.tex | 2 + statistics/lecture/statistics-chapter.tex | 2 +- statistics/lecture/statistics.tex | 2 +- 17 files changed, 75 insertions(+), 65 deletions(-) diff --git a/Makefile b/Makefile index 16301a5..9a4e91f 100644 --- a/Makefile +++ b/Makefile @@ -9,14 +9,18 @@ chapters : for sd in $(SUBDIRS); do $(MAKE) -C $$sd/lecture pdf; done $(BASENAME).pdf : $(BASENAME).tex header.tex $(SUBTEXS) - export TEXMFOUTPUT=.; pdflatex -interaction=scrollmode $< | tee /dev/stderr | fgrep -q "Rerun to get cross-references right" && pdflatex -interaction=scrollmode $< || true + pdflatex -interaction=scrollmode $< | tee /dev/stderr | fgrep -q "Rerun to get cross-references right" && pdflatex -interaction=scrollmode $< || true + +again : + pdflatex $(BASENAME).tex index : - splitindex $(BASENAME).idx - export TEXMFOUTPUT=.; pdflatex -interaction=scrollmode $(BASENAME).tex + pdflatex -interaction=scrollmode $(BASENAME).tex + splitindex $(BASENAME).idx + pdflatex -interaction=scrollmode $(BASENAME).tex | tee /dev/stderr | fgrep -q "Rerun to get cross-references right" && pdflatex $(BASENAME).tex || true clean : - rm -f *~ $(BASENAME).aux $(BASENAME).log $(BASENAME).out $(BASENAME).toc + rm -f *~ $(BASENAME).aux $(BASENAME).log $(BASENAME).out $(BASENAME).toc $(BASENAME).lo? $(BASENAME).idx $(BASENAME)-term.i* $(BASENAME)-code.i* for sd in $(SUBDIRS); do $(MAKE) -C $$sd/lecture clean; done cleanall : clean diff --git a/bootstrap/lecture/bootstrap-chapter.tex b/bootstrap/lecture/bootstrap-chapter.tex index 7ecd9a5..1a06199 100644 --- a/bootstrap/lecture/bootstrap-chapter.tex +++ b/bootstrap/lecture/bootstrap-chapter.tex @@ -5,7 +5,7 @@ \lstset{inputpath=../code} \graphicspath{{figures/}} -\setcounter{page}{81} +\setcounter{page}{77} \setcounter{chapter}{4} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% diff --git a/header.tex b/header.tex index d067f4c..9329c5d 100644 --- a/header.tex +++ b/header.tex @@ -189,9 +189,9 @@ \newcommand{\koZ}{\mathds{C}} %%%%% english, german, code and file terms: %%%%%%%%%%%%%%% -\newcommand{\enterm}[1]{``#1''\sindex[term]{#1}} -\newcommand{\determ}[1]{\textit{#1}\sindex[term]{#1}} -\newcommand{\codeterm}[1]{\textit{#1}\sindex[term]{#1}} +\newcommand{\enterm}[1]{``#1''\protect\sindex[term]{#1}} +\newcommand{\determ}[1]{\textit{#1}\protect\sindex[term]{#1}} +\newcommand{\codeterm}[1]{\textit{#1}\protect\sindex[term]{#1}} \newcommand{\file}[1]{\texttt{#1}} %%%%% key-shortcuts %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -202,8 +202,9 @@ %%%%% code/matlab commands: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \usepackage{textcomp} -\newcommand{\code}[1]{\setlength{\fboxsep}{0.5ex}\colorbox{codeback}{\texttt{#1}}\sindex[code]{#1}} -\newcommand{\matlab}{MATLAB$^{\copyright}$} +\newcommand{\varcode}[1]{\setlength{\fboxsep}{0.5ex}\colorbox{codeback}{\texttt{#1}}} +\newcommand{\code}[1]{\varcode{#1}\sindex[code]{#1}} +\newcommand{\matlab}{\texorpdfstring{MATLAB$^{\copyright}$}{MATLAB}} \newcommand{\matlabfun}[1]{(\tr{\matlab{}-function}{\matlab-Funktion} \setlength{\fboxsep}{0.5ex}\colorbox{codeback}{\texttt{#1}})\sindex[code]{#1}} %%%%% exercises environment: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -241,18 +242,20 @@ \newcommand{\exerciseoutput}{#2}% \setlength{\fboxsep}{2mm}% \newcommand{\saveenumi}{\theenumi}\renewcommand{\labelenumi}{(\alph{enumi})}% - \captionsetup{singlelinecheck=off,hypcap=false,labelfont={large,sf,it,bf},font={large,sf,it,bf},skip={0.5ex}} + \captionsetup{singlelinecheck=off,hypcap=false,labelfont={large,sf,it,bf},font={large,sf,it,bf},skip={0.5ex}}% \begin{mdframed}[linewidth=0pt,backgroundcolor=exerciseback]% \captionof{exercisef}[\exercisefile]{}% \captionsetup{font={normal,sf,it}}% }% - {\ifthenelse{\equal{\exercisesource}{}}{}% - {\ifthenelse{\value{exercise}>\value{maxexercise}}{}% + {\hypersetup{hypertexnames=false}% + \ifthenelse{\equal{\exercisesource}{}}{}% + {\ifthenelse{\value{exercisef}>\value{maxexercise}}{}% {\addtocounter{lstlisting}{-1}% \lstinputlisting[belowskip=0pt,aboveskip=1ex,nolol=true,title={\textbf{Listing:} \exercisefile}]{\codepath\exercisesource}% \ifthenelse{\equal{\exerciseoutput}{}}{}% {\addtocounter{lstlisting}{-1}% \lstinputlisting[language={},title={\textbf{\tr{Output}{Ausgabe}:}},nolol=true,belowskip=0pt]{\codepath\exerciseoutput}}}}% + \hypersetup{hypertexnames=true}% \end{mdframed}% \renewcommand{\theenumi}{\saveenumi}} @@ -303,7 +306,7 @@ % placement=t % ]{importantf} \newenvironment{important}[1][]% -{\captionsetup{singlelinecheck=off,labelformat={empty},labelfont={large,sf,it,bf},font={large,sf,it,bf}} +{\captionsetup{singlelinecheck=off,hypcap=false,labelformat={empty},labelfont={large,sf,it,bf},font={large,sf,it,bf}} \ifthenelse{\equal{#1}{}}% {\begin{mdframed}[linecolor=importantline,linewidth=1ex,% backgroundcolor=importantback,font={\sffamily}]}% @@ -318,5 +321,6 @@ %%%%% hyperref %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \usepackage[bookmarks=true,bookmarksopen=true,% pdfpagemode=UseNone,pdfstartview=FitH,% + plainpages=false,pdfpagelabels,% breaklinks=true,colorlinks=true,% citecolor=blue!50!black,linkcolor=red!70!black,urlcolor=blue!50!black]{hyperref} diff --git a/likelihood/lecture/likelihood-chapter.tex b/likelihood/lecture/likelihood-chapter.tex index 0f74fe3..2f15436 100644 --- a/likelihood/lecture/likelihood-chapter.tex +++ b/likelihood/lecture/likelihood-chapter.tex @@ -5,7 +5,7 @@ \lstset{inputpath=../code} \graphicspath{{figures/}} -\setcounter{page}{101} +\setcounter{page}{99} \setcounter{chapter}{6} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% diff --git a/plotting/lecture/plotting.tex b/plotting/lecture/plotting.tex index a37bb1d..1aba67d 100644 --- a/plotting/lecture/plotting.tex +++ b/plotting/lecture/plotting.tex @@ -298,7 +298,7 @@ Datenpunkte. Zus\"atzlich wird noch die Eigenschaft \codeterm{displayname} gesetzt, um dem Linienplot einen Namen zu geben, der in einer Legende verwendet werden kann. -\begin{lstlisting}[label=settinglineprops, caption={Setzen von Linieneigenschaften beim \code{plot} Aufruf}] +\begin{lstlisting}[label=settinglineprops, caption={Setzen von Linieneigenschaften beim \varcode{plot} Aufruf}] x = 0:0.1:2*pi; y = sin(x); plot( x, y, 'color', 'r', 'linestyle', ':', 'marker', '*', 'linewidth', 1.5, 'displayname', 'plot 1') @@ -427,14 +427,14 @@ Homepage viele Beispiele mit zugeh\"origem Code \begin{tabular}{|l|c|l|} \hline \textbf{Format} & \textbf{Typ} & \code{saveas} Argument \rule[-1.2ex]{0pt}{3.5ex} \\ \hline - pdf & Vektor & \codeterm{'pdf'} \rule{0pt}{2.5ex} \\ - eps & Vektor & \codeterm{'eps', 'epsc'} \\ - SVG & Vektor & \codeterm{'svg'} \\ - PS & Vektor & \codeterm{'ps', 'psc'} \\ - jpg & Bitmap & \codeterm{'jpeg'} \\ - tif & Bitmap & \codeterm{'tiff', 'tiffn'} \\ - png & Bitmap & \codeterm{'png'} \\ - bmp & Bitmap & \codeterm{'bmp'} \\ \hline + pdf & Vektor & \varcode{'pdf'} \rule{0pt}{2.5ex} \\ + eps & Vektor & \varcode{'eps'}, \varcode{'epsc'} \\ + SVG & Vektor & \varcode{'svg'} \\ + PS & Vektor & \varcode{'ps'}, \varcode{'psc'} \\ + jpg & Bitmap & \varcode{'jpeg'} \\ + tif & Bitmap & \varcode{'tiff'}, \varcode{'tiffn'} \\ + png & Bitmap & \varcode{'png'} \\ + bmp & Bitmap & \varcode{'bmp'} \\ \hline \end{tabular} \end{minipage} \vspace{1ex} diff --git a/pointprocesses/lecture/pointprocesses-chapter.tex b/pointprocesses/lecture/pointprocesses-chapter.tex index 70de527..abbf168 100644 --- a/pointprocesses/lecture/pointprocesses-chapter.tex +++ b/pointprocesses/lecture/pointprocesses-chapter.tex @@ -5,8 +5,8 @@ \lstset{inputpath=../code} \graphicspath{{figures/}} -\setcounter{page}{111} -\setcounter{chapter}{7} +\setcounter{page}{} +\setcounter{chapter}{-1} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% diff --git a/pointprocesses/lecture/pointprocessscetchA.eps b/pointprocesses/lecture/pointprocessscetchA.eps index 041fcf8..f0a0b2d 100644 --- a/pointprocesses/lecture/pointprocessscetchA.eps +++ b/pointprocesses/lecture/pointprocessscetchA.eps @@ -1,7 +1,7 @@ %!PS-Adobe-2.0 EPSF-2.0 %%Title: pointprocessscetchA.tex %%Creator: gnuplot 4.6 patchlevel 4 -%%CreationDate: Tue Nov 3 17:29:16 2015 +%%CreationDate: Sun Nov 22 12:40:02 2015 %%DocumentFonts: %%BoundingBox: 50 50 373 135 %%EndComments @@ -430,10 +430,10 @@ SDict begin [ /Title (pointprocessscetchA.tex) /Subject (gnuplot plot) /Creator (gnuplot 4.6 patchlevel 4) - /Author (grewe) + /Author (jan) % /Producer (gnuplot) % /Keywords () - /CreationDate (Tue Nov 3 17:29:16 2015) + /CreationDate (Sun Nov 22 12:40:02 2015) /DOCINFO pdfmark end } ifelse diff --git a/pointprocesses/lecture/pointprocessscetchA.pdf b/pointprocesses/lecture/pointprocessscetchA.pdf index 8da55092be918fd0fe5b3c61c029775cf6bdbaa9..57b844721fb807c21def0ff5ac59274c54bd1a75 100644 GIT binary patch delta 340 zcmca8dRBBpI}@Y9<_;!XMqX1xL!;z00~6h3OQXce0c`S#ab4NE*6DMO+MxQa^>i%KerQq#DMObm^rdQo&kI}@YP<_;!XMqW!p6LaHK0|VV8( zure{XGBurimPJD%JT*l@*FRaeL?Oh;!b-u=3M^@5I+>TX35y}SS?w`IB__+WsbGjc zW=%@XOG(^p#@@|n46?;PxkSOpLIGyGf{}rtsV0}cZ+?nPVo9ooixo(~(7?#T(89zV z=(;Z)*$^WpCvmzmnonNAc_P-u$jQ;b#K_pu)WyKW)y>Sv%+b)%+{o0x#n{5s(b3t? hhM?+%f}s^y(#mLZBTo~CA#oTY5|bzMs$hu9 zPkzjMggGlQZ}S?yZboB}9e(*`3Pwf>FuN6u3=B;*x%7SWQ(O{DQZ-zxKmtIY7#SLw z7y#XtC6Em=VDc>iS4QK>3W6tM4UL@*EQ}3Yoh@B0jLi%z%#57O-JD!4oQz$}Eu9=q j?Q96Dh~=`g<0>vmEGnreN=@T3F*Y*bQdM>JcjE#82di02 delta 344 zcmX@8a#Ur*Z%#&|&3`y;8F?)YQ_@mQEDUs$Op`1o3-HQMPUX(R5LKA`huebJK-b73 z#L&XZ#N5i%Y_cPdhD3O3ih{0xvTlh&h>?Yrf}s^y(#mXdBTo~CA#oTY5|bzMs$hu9 zPkzjMgf%HOFC}sFD!y(;V~{QW$t4O#778%i6^slFO*Ognee+XX5=&AwT&zF>h6Y9! zh88B~K-XmmWJ8RYd`-ZW(R8wm;E7l#M*~+U14}bQLvvS4b2ArbX9H7bH&a)0S63HD l17}A&8-glgx$Nw?ic1oUN-By{)3{8GjZC;yRbBnvxBx91T(STF diff --git a/programming/lecture/programming.tex b/programming/lecture/programming.tex index 5bbcf17..05548b0 100644 --- a/programming/lecture/programming.tex +++ b/programming/lecture/programming.tex @@ -40,7 +40,7 @@ befassen. In \matlab{} kann eine Variable auf der Kommandozeile, in einem Skript oder einer Funktion an beliebiger Stelle erzeugt werden. Listing \ref{varListing1} zeigt zwei M\"oglichkeiten dies zu tun: -\begin{lstlisting}[label=varListing1, caption=Erzeugen von Variablen.] +\begin{lstlisting}[label=varListing1, caption={Erzeugen von Variablen.}] >> y = [] y = [] @@ -77,7 +77,7 @@ Variablen diesen Datentyp. Nat\"urlich kann mit den Variablen auch gearbeitet, bzw. gerechnet werden. \matlab{} kennt alle normalen arithmetischen Operatoren wie \code{+}, \code{-}, \code{*} und \code{/}. Die Potenz wird \"uber das -Dachsymbol \code{\^} dargestellt. Listing \ref{varListing3} zeigt, wie sie +Dachsymbol \code{\^{}} dargestellt. Listing \ref{varListing3} zeigt, wie sie benutzt werden. \begin{lstlisting}[label=varListing3, caption={Rechnen mit Variablen.}] @@ -324,7 +324,7 @@ Element gleichzeitig zuzugreifen. \begin{exercise}{vectorsize.m}{vectorsize.out} Der R\"uckgabewert von \code{size(a)} ist wieder ein Vektor der - L\"ange 2. Wie k\"onnte man also die Gr\"o{\ss}e von \code{a} in der + L\"ange 2. Wie k\"onnte man also die Gr\"o{\ss}e von \varcode{a} in der zweiten Dimension herausfinden? \end{exercise} @@ -365,8 +365,8 @@ problemlos m\"oglich. Bei der Multiplikation (Zeile 10), der Division (Zeile 14) und auch der Potenzierung mu{\ss} mit vorangestellem '.' klar gemacht werden, dass es sich um eine \emph{elementweise} Verarbeitung handeln soll. F\"ur diese elementweisen Operationen kennt -\matlab{} die Operatoren \code{.*}, \code{./} und \code{.\^}. Die -einfachen Operatoren \code{*}, \code{/} und \code{\^} sind mit den +\matlab{} die Operatoren \code{.*}, \code{./} und \code{.\^{}}. Die +einfachen Operatoren \code{*}, \code{/} und \code{\^{}} sind mit den entsprechenden Matrixoperationen aus der linearen Algebrar belegt (Box \ref{matrixmultiplication}). @@ -806,16 +806,16 @@ nur die Werte an den Stellen zur\"uck, an denen der logische Vektor \end{lstlisting} \begin{exercise}{logicalVector.m}{logicalVector.out} - Erstelle einen Vektor x mit den Werten 0-10. + Erstelle einen Vektor \varcode{x} mit den Werten 0--10. \begin{enumerate} - \item F\"uhre aus: \code{y = x < 5} - \item Gib den Inhalt von \code{y} auf dem Bildschirm aus. - \item Was ist der Datentyp von \code{y}? - \item Gibt alle Elemente aus x zur\"uck, die kleiner als 5 sind. + \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} Zeile 12 in der L\"osung kann wie folgt gelesen werden: Gib mir die Elemente - von (\code{x}) an den Stellen, an denen \code{x < 5} wahr ist. + von (\varcode{x}) an den Stellen, an denen \varcode{x < 5} wahr ist. \end{exercise} Logisches Indizieren wurde oben so benutzt, dass die Auswahl @@ -842,13 +842,13 @@ bestimmten Zeitraums ausw\"ahlen m\"ochte (Abbildung jeweiligen Messwerten. \begin{itemize} - \item Erstelle einen Vektor \code{t = 0:0.001:10;}, der z.B. die Zeit + \item Erstelle einen Vektor \varcode{t = 0:0.001:10;}, der z.B. die Zeit repr\"asentiert. - \item Erstelle einen zweiten Vektor \code{x} mit Zufallszahlen der - die gleiche L\"ange hat wie \code{t}. Die Werte darin stellen - Messungen zu den Zeitpunkten in \code{t} dar. + \item Erstelle einen zweiten Vektor \varcode{x} mit Zufallszahlen der + die gleiche L\"ange hat wie \varcode{t}. Die Werte darin stellen + Messungen zu den Zeitpunkten in \varcode{t} dar. \item Benutze das logische Indizieren um die Messwerte - auszuw\"ahlen, die dem zeitlichen Abschnitt 5-6\,s entsprechen. + auszuw\"ahlen, die dem zeitlichen Abschnitt 5--6\,s entsprechen. \end{itemize} \end{exercise} @@ -925,7 +925,7 @@ ausgef\"uhrt werden. Die Schleife wird durch das Schl\"usselwort \code{end} beendet. Listing \ref{looplisting} zeigt das Grundger\"ust einer for-Schleife. -\begin{lstlisting}[caption={Beispiel einer \code{for} Schleife. Die Laufvariable \code{x} nimmt mit jeder Iteration der Schleife einen Wert des Vektors \code{1:5} an.}, label=looplisting] +\begin{lstlisting}[caption={Beispiel einer \varcode{for} Schleife. Die Laufvariable \varcode{x} nimmt mit jeder Iteration der Schleife einen Wert des Vektors \varcode{1:5} an.}, label=looplisting] for x = 1:5 % ... etwas sinnvolles mit x ... end @@ -939,7 +939,7 @@ end \end{exercise} -\subsubsection{Die \code{while} -- Schleife} +\subsubsection{Die \varcode{while} -- Schleife} Eine weiterer Schleifentyp, der weniger h\"aufig eingesetzt wird, ist die \code{while}-Schleife. Auch sie hat ihre Entsprechungen in fast @@ -952,7 +952,7 @@ Schleifenk\"orper ausgef\"uhrt. Die Schleife wird mit dem Schl\"usselwort \code{end} beendet. -\begin{lstlisting}[caption={Grundstruktur einer \code{while} Schleife.}, label=whileloop] +\begin{lstlisting}[caption={Grundstruktur einer \varcode{while} Schleife.}, label=whileloop] while x == true % fuehre diesen sinnvollen code aus ... end @@ -971,7 +971,7 @@ end \end{exercise} -\subsubsection{Vergleich \code{for} -- und \code{while}--Schleife} +\subsubsection{Vergleich \varcode{for} -- und \varcode{while}--Schleife} \begin{itemize} \item Beide f\"uhren den Code im Schleifenk\"orper iterativ aus. \item Der K\"orper einer \code{for} Schleife wird mindestens 1 mal @@ -994,7 +994,7 @@ Bedingte Anweisungen und Verzweigungen sind Kontrollstrukturen, die regeln, dass der in ihnen eingeschlossene Programmcode nur unter bestimmten Bedingungen ausgef\"uhrt wird. -\subsubsection{Die \code{if} -- Anweisung} +\subsubsection{Die \varcode{if} -- Anweisung} Am h\"aufigsten genutzter Vertreter ist die \code{if} - Anweisung. Sie wird genutzt um Programmcode nur unter bestimmten @@ -1012,7 +1012,7 @@ beendet. Listing \ref{ifelselisting} zeigt den Aufbau einer \code{if} - Anweisung. -\begin{lstlisting}[label=ifelselisting, caption={Grundger\"ust einer \code{if} Anweisung.}] +\begin{lstlisting}[label=ifelselisting, caption={Grundger\"ust einer \varcode{if} Anweisung.}] if x < y % fuehre diesen code aus elseif x > y @@ -1032,7 +1032,7 @@ end \end{enumerate} \end{exercise} -\subsubsection{Die \code{switch} -- Verzweigung} +\subsubsection{Die \varcode{switch} -- Verzweigung} Die \code{switch} Verzweigung wird eingesetzt wenn mehrere F\"alle auftreten k\"onnen, die einer unterschiedlichen Behandlung bed\"urfen. @@ -1049,7 +1049,7 @@ F\"alle behandelt werden. Die \code{switch} Anweisung wird mit \code{end} beendet (z.B. in Listing \ref{switchlisting}). -\begin{lstlisting}[label=switchlisting, caption={Grundger\"ust einer \code{switch} Anweisung.}] +\begin{lstlisting}[label=switchlisting, caption={Grundger\"ust einer \varcode{switch} Anweisung.}] mynumber = input('Enter a number:'); switch mynumber case -1 @@ -1065,7 +1065,7 @@ Wichtig ist hier, dass in jedem \code{case} auf Gleichheit der switch-Anweisung und der case-Anweisung getestet wird. -\subsubsection{Vergleich \code{if} -- Anweisung und \code{switch} -- Verzweigung} +\subsubsection{Vergleich \varcode{if} -- Anweisung und \varcode{switch} -- Verzweigung} \begin{itemize} \item Mit der \code{if} Anweisung k\"onnen beliebige F\"alle unterschieden und entsprechender Code ausgef\"uhrt werden. @@ -1085,7 +1085,7 @@ werden, werden die Schl\"usselworte \code{break} und \code{continue} eingesetzt (Listing \ref{breakcontinuelisting} zeigt, wie sie eingesetzt werden k\"onnen). -\begin{lstlisting}[caption={Einsatz der \code{continue} und \code{break} Schl\"usselworte um die Ausf\"uhrung von Code-Abschnitten in Schleifen zu \"uberspringen oder abzubrechen.}, label=breakcontinuelisting] +\begin{lstlisting}[caption={Einsatz der \varcode{continue} und \varcode{break} Schl\"usselworte um die Ausf\"uhrung von Code-Abschnitten in Schleifen zu \"uberspringen oder abzubrechen.}, label=breakcontinuelisting] for x = 1:10 if(x > 2 & x < 5) continue; diff --git a/programmingstyle/lecture/programmingstyle-chapter.tex b/programmingstyle/lecture/programmingstyle-chapter.tex index d82204d..2ad3b5d 100644 --- a/programmingstyle/lecture/programmingstyle-chapter.tex +++ b/programmingstyle/lecture/programmingstyle-chapter.tex @@ -5,7 +5,7 @@ \lstset{inputpath=../code} \graphicspath{{figures/}} -\setcounter{page}{57} +\setcounter{page}{55} \setcounter{chapter}{2} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% diff --git a/programmingstyle/lecture/programmingstyle.tex b/programmingstyle/lecture/programmingstyle.tex index bb1010c..d4f88a7 100644 --- a/programmingstyle/lecture/programmingstyle.tex +++ b/programmingstyle/lecture/programmingstyle.tex @@ -169,8 +169,8 @@ Aktionspotentialen speichert, k\"onnte also nur einen sondern mehrere Werte aufnimmt, dann ist der Plural angebracht (\codeterm{average\_spike\_counts}). -Die Laufvariablen von \code{for}-Schleifen werden oft nur \code{i}, -\code{j} oder \code{k} benannt und sollten aber die einzige Ausnahme +Die Laufvariablen von \code{for}-Schleifen werden oft nur \varcode{i}, +\varcode{j} oder \varcode{k} benannt und sollten aber die einzige Ausnahme bzgl. ausdrucksstarker Namensgebung bleiben. \begin{important}[Benennung von Variablen] @@ -328,7 +328,7 @@ M\"oglichkeit sogenannte \codeterm{lokale Funktionen} oder auch erstellen. Listing \ref{localfunctions} zeigt ein Beispiel f\"ur eine lokale Funktion. -\lstinputlisting[label=localfunctions, caption={\codeterm{Lokale Funktionen} erh\"ohen die Lesbarkeit sind aber nur innerhalb der definierenden Datei verf\"ugbar.}]{calculate_sines.m} +\lstinputlisting[label=localfunctions, caption={Lokale Funktionen erh\"ohen die Lesbarkeit sind aber nur innerhalb der definierenden Datei verf\"ugbar.}]{calculate_sines.m} Lokale Funktionen existieren in der gleichen Datei und sind nur dort verf\"ugbar. Jede Funktion hat ihren eigenen G\"ultigkeitsbereich, das diff --git a/regression/lecture/regression-chapter.tex b/regression/lecture/regression-chapter.tex index 0df5e2b..9b9fc79 100644 --- a/regression/lecture/regression-chapter.tex +++ b/regression/lecture/regression-chapter.tex @@ -5,7 +5,7 @@ \lstset{inputpath=../code} \graphicspath{{figures/}} -\setcounter{page}{89} +\setcounter{page}{85} \setcounter{chapter}{5} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% diff --git a/scientificcomputing-script.tex b/scientificcomputing-script.tex index c1a5a92..3d090c5 100644 --- a/scientificcomputing-script.tex +++ b/scientificcomputing-script.tex @@ -8,7 +8,9 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \begin{document} +\hypersetup{pageanchor=false} \maketitle +\hypersetup{pageanchor=true} \tableofcontents \listoffigures diff --git a/statistics/lecture/statistics-chapter.tex b/statistics/lecture/statistics-chapter.tex index ad93f38..fa31714 100644 --- a/statistics/lecture/statistics-chapter.tex +++ b/statistics/lecture/statistics-chapter.tex @@ -5,7 +5,7 @@ \lstset{inputpath=../code} \graphicspath{{figures/}} -\setcounter{page}{69} +\setcounter{page}{67} \setcounter{chapter}{3} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% diff --git a/statistics/lecture/statistics.tex b/statistics/lecture/statistics.tex index 4667e03..0e9569e 100644 --- a/statistics/lecture/statistics.tex +++ b/statistics/lecture/statistics.tex @@ -223,7 +223,7 @@ Standardabweichung $\sigma$. ab. Rechts: Bei auf das Integral normierten Histogrammen werden auch unterschiedliche Klassenbreiten untereinander vergleichbar und auch mit der theoretischen Wahrschinlichkeitsdichtefunktion - (blau).}} + (blau).} \end{figure} \begin{exercise}{gaussianbins.m}{} From 993ab5d8e70e309bc1b342fac3c68ac891a1dc31 Mon Sep 17 00:00:00 2001 From: Jan Benda Date: Sun, 22 Nov 2015 23:16:22 +0100 Subject: [PATCH 02/17] Improved indices. Added optional parameter for index to *term* macros. --- Makefile | 2 +- bootstrap/lecture/bootstrap.tex | 2 +- designpattern/lecture/designpattern.tex | 4 +- header.tex | 15 +-- likelihood/lecture/likelihood.tex | 6 +- plotting/lecture/plotting.tex | 99 ++++++++++--------- .../lecture/pointprocesses-chapter.tex | 4 +- pointprocesses/lecture/pointprocesses.tex | 23 ++--- programming/lecture/programming.tex | 40 ++++---- .../lecture/programmingstyle-chapter.tex | 2 +- programmingstyle/lecture/programmingstyle.tex | 22 ++--- regression/lecture/regression-chapter.tex | 2 +- regression/lecture/regression.tex | 32 +++--- scientificcomputing-script.tex | 5 +- statistics/lecture/statistics-chapter.tex | 2 +- statistics/lecture/statistics.tex | 12 +-- 16 files changed, 138 insertions(+), 134 deletions(-) diff --git a/Makefile b/Makefile index 9a4e91f..2a9b5ef 100644 --- a/Makefile +++ b/Makefile @@ -20,7 +20,7 @@ index : pdflatex -interaction=scrollmode $(BASENAME).tex | tee /dev/stderr | fgrep -q "Rerun to get cross-references right" && pdflatex $(BASENAME).tex || true clean : - rm -f *~ $(BASENAME).aux $(BASENAME).log $(BASENAME).out $(BASENAME).toc $(BASENAME).lo? $(BASENAME).idx $(BASENAME)-term.i* $(BASENAME)-code.i* + rm -f *~ $(BASENAME).aux $(BASENAME).log $(BASENAME).out $(BASENAME).toc $(BASENAME).lo? $(BASENAME).idx $(BASENAME)-term.i* $(BASENAME)-enterm.i* $(BASENAME)-code.i* for sd in $(SUBDIRS); do $(MAKE) -C $$sd/lecture clean; done cleanall : clean diff --git a/bootstrap/lecture/bootstrap.tex b/bootstrap/lecture/bootstrap.tex index 0cf4cb0..f142de5 100644 --- a/bootstrap/lecture/bootstrap.tex +++ b/bootstrap/lecture/bootstrap.tex @@ -186,7 +186,7 @@ Bestimme die Signifikanz eines Korrelationskoeffizienten. \item Berechne den Korrelationskoeffizient dieser Datenpaare. \item Generiere die Verteilung der Nullhypothese ``unkorrelierte Daten'' indem die $x$- und $y$-Daten 1000-mal unabh\"angig - permutiert werden \matlabfun{randperm} und jeweils der + permutiert werden \matlabfun{randperm()} und jeweils der Korrelationskoeffizient berechnet wird. \item Bestimme aus den Nullhypothesendaten das 95\,\%-Perzentil und vergleiche es mit dem tats\"achlichen Korrelationskoeffizienten. diff --git a/designpattern/lecture/designpattern.tex b/designpattern/lecture/designpattern.tex index a13c290..ec90e3f 100644 --- a/designpattern/lecture/designpattern.tex +++ b/designpattern/lecture/designpattern.tex @@ -86,7 +86,7 @@ sigma = 2.3; y = randn(100, 1)*sigma + mu; \end{lstlisting} -Das gleiche Prinzip ist manchmal auch sinnvoll f\"ur \code{zeros} oder \code{ones}: +Das gleiche Prinzip ist manchmal auch sinnvoll f\"ur \code{zeros()} oder \code{ones()}: \begin{lstlisting}[caption={Skalierung von zeros und ones}] x = -1:0.01:2; % Vektor mit x-Werten plot(x, exp(-x.*x)); @@ -141,7 +141,7 @@ Meistens sollten Histogramme normiert werden, damit sie vergleichbar mit anderen Histogrammen oder mit theoretischen Wahrscheinlichkeitsverteilungen werden. -Die \code{histogram} Funktion macht das mit den entsprechenden Parametern automatisch: +Die \code{histogram()} Funktion macht das mit den entsprechenden Parametern automatisch: \begin{lstlisting}[caption={Probability-density-function mit der histogram-Funktion}] x = randn(100, 1); % irgendwelche reellwertige Daten histogram(x, 'Normalization', 'pdf'); diff --git a/header.tex b/header.tex index 9329c5d..01414c8 100644 --- a/header.tex +++ b/header.tex @@ -27,7 +27,8 @@ \usepackage[makeindex]{splitidx} \makeindex \newindex[Fachbegriffe]{term} -\newindex[Code]{code} +\newindex[Englische Fachbegriffe]{enterm} +\newindex[MATLAB Code]{code} %%%%% units %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \usepackage[mediumspace,mediumqspace,Gray]{SIunits} % \ohm, \micro @@ -189,9 +190,10 @@ \newcommand{\koZ}{\mathds{C}} %%%%% english, german, code and file terms: %%%%%%%%%%%%%%% -\newcommand{\enterm}[1]{``#1''\protect\sindex[term]{#1}} -\newcommand{\determ}[1]{\textit{#1}\protect\sindex[term]{#1}} -\newcommand{\codeterm}[1]{\textit{#1}\protect\sindex[term]{#1}} +\usepackage{ifthen} +\newcommand{\enterm}[2][]{``#2''\ifthenelse{\equal{#1}{}}{\protect\sindex[enterm]{#2}}{\protect\sindex[term]{#1}}} +\newcommand{\determ}[2][]{\textit{#2}\ifthenelse{\equal{#1}{}}{\protect\sindex[term]{#2}}{\protect\sindex[term]{#1}}} +\newcommand{\codeterm}[2][]{\textit{#2}\ifthenelse{\equal{#1}{}}{\protect\sindex[term]{#2}}{\protect\sindex[term]{#1}}} \newcommand{\file}[1]{\texttt{#1}} %%%%% key-shortcuts %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -203,9 +205,9 @@ %%%%% code/matlab commands: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \usepackage{textcomp} \newcommand{\varcode}[1]{\setlength{\fboxsep}{0.5ex}\colorbox{codeback}{\texttt{#1}}} -\newcommand{\code}[1]{\varcode{#1}\sindex[code]{#1}} +\newcommand{\code}[2][]{\varcode{#2}\ifthenelse{\equal{#1}{}}{\protect\sindex[code]{#2}}{\protect\sindex[code]{#1}}} \newcommand{\matlab}{\texorpdfstring{MATLAB$^{\copyright}$}{MATLAB}} -\newcommand{\matlabfun}[1]{(\tr{\matlab{}-function}{\matlab-Funktion} \setlength{\fboxsep}{0.5ex}\colorbox{codeback}{\texttt{#1}})\sindex[code]{#1}} +\newcommand{\matlabfun}[2][]{(\tr{\matlab-function}{\matlab-Funktion} \setlength{\fboxsep}{0.5ex}\colorbox{codeback}{\texttt{#1}})\ifthenelse{\equal{#1}{}}{\protect\sindex[code]{#2}}{\protect\sindex[code]{#1}}} %%%%% exercises environment: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % usage: @@ -224,7 +226,6 @@ % content of someoutput.out % % Innerhalb der exercise Umgebung ist enumerate umdefiniert, um (a), (b), (c), .. zu erzeugen. -\usepackage{ifthen} \usepackage{mdframed} \usepackage{xstring} \newcommand{\codepath}{} diff --git a/likelihood/lecture/likelihood.tex b/likelihood/lecture/likelihood.tex index bdeb82d..62872f3 100644 --- a/likelihood/lecture/likelihood.tex +++ b/likelihood/lecture/likelihood.tex @@ -195,7 +195,7 @@ die Steigung $m$ und der y-Achsenabschnitt $b$ einer Geradengleichung \[ y = m \cdot x +b \] oder allgemeiner die Koeffizienten $a_k$ eines Polynoms \[ y = \sum_{k=0}^N a_k x^k = a_o + a_1x + a_2x^2 + a_3x^4 + \ldots \] -\matlabfun{polyfit}. +\matlabfun{polyfit()}. Parameter, die nichtlinear in einer Funktion enthalten sind, k\"onnen im Gegensatz dazu nicht analytisch aus den Daten berechnet @@ -203,7 +203,7 @@ werden. z.B. die Rate $\lambda$ eines exponentiellen Zerfalls \[ y = c \cdot e^{\lambda x} \quad , \quad c, \lambda \in \reZ \; . \] F\"ur diesen Fall bleibt dann nur auf numerische Verfahren zur Optimierung der Kostenfunktion, wie z.B. der Gradientenabstieg, -zur\"uckzugreifen \matlabfun{lsqcurvefit}. +zur\"uckzugreifen \matlabfun{lsqcurvefit()}. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -243,7 +243,7 @@ Maximum Likelihood! Wir suchen einfach die Parameter $\theta$ der gesuchten Wahrscheinlichkeitsdichtefunktion bei der die Log-Likelihood \eqnref{loglikelihood} maximal wird. Das ist im allgemeinen ein nichtlinieares Optimierungsproblem, das mit numerischen Verfahren, wie -z.B. dem Gradientenabstieg, gel\"ost wird \matlabfun{mle}. +z.B. dem Gradientenabstieg, gel\"ost wird \matlabfun{mle()}. \begin{exercise}{mlegammafit.m}{mlegammafit.out} Erzeuge Gammaverteilte Zufallszahlen und benutze Maximum-Likelihood, diff --git a/plotting/lecture/plotting.tex b/plotting/lecture/plotting.tex index 1aba67d..77456da 100644 --- a/plotting/lecture/plotting.tex +++ b/plotting/lecture/plotting.tex @@ -34,13 +34,13 @@ Zwecken genutzt wird. Ein Datenplot muss ausreichend beschriftet werden: \begin{itemize} \item Alle Achsen m\"ussen eine Bezeichnung und eine Einheit erhalten\\ - (z.B. \code{xlabel('Geschwindigkeit [m/s]'}). + (z.B. \code[xlabel()]{xlabel('Geschwindigkeit [m/s]'}). \item Wenn mehrere Dinge in einem Plot dargestellt werden, m\"ussen diese mit einer Legende oder \"ahnlichem benannt werden \matlabfun{legend()}. \item Mehrere Plots mit den gleichen Gr\"o{\ss}en auf den Achsen, m\"ussen den gleichen Wertebereich auf den Achsen zeigen - (z.B. \code{xlim([0 100])}.\\ + (z.B. \code[xlim()]{xlim([0 100])}.\\ Ausnahmen sind m\"oglich, sollten aber in der Abbildungsunterschrift erw\"ahnt werden. \item Die Beschriftung mu{\ss} gro{\ss} genug sein, um lesbar zu sein. @@ -142,7 +142,7 @@ darzustellen (\figref{misleadingsymbolsfig}). \section{Das Plottingsystem von \matlab{}} Plotten in \matlab{} ist zun\"achst einmal einfach. Durch den Aufruf -von \code{plot(x, y)} wird ein einfacher, schlichter Linienplot +von \code[plot()]{plot(x, y)} wird ein einfacher, schlichter Linienplot erstellt. Diesem Plot fehlen jedoch jegliche Annotationen wie Achsbeschriftungen, Legenden, etc. Es gibt zwei M\"oglichkeiten diese hinzuzuf\"ugen: (i) das Graphische User Interface oder (ii) die @@ -212,9 +212,9 @@ Datens\"atzen erstellt werden soll. \subsection{Einfaches Plotten} Einen einfachen Linienplot zu erstellen ist denkbar -einfach. Angenommen, es existiert einer Variable \code{y} im +einfach. Angenommen, es existiert einer Variable \varcode{y} im \enterm{Workspace}, die die darzustellenden Daten enth\"alt. Es -gen\"ugt folgender Funktionsaufruf: \code{plot(y)}. Wenn bislang noch +gen\"ugt folgender Funktionsaufruf: \code[plot()]{plot(y)}. Wenn bislang noch keine Abbildung erstellt wurde, \"offnet \matlab{} ein neues Fenster und stellt die Daten als Linienplot dar. Dabei werden die Datenpunkte durch eine Linie verbunden. Die Messpunkte selbst sind nicht @@ -223,14 +223,14 @@ ersetzt. Das Festhalten von bestehenden Plots kann an- oder abgestellt werden indem \code{hold on} bzw. \code{hold off} vor dem \code{plot()} Befehl aufgerufen wird. -Im obigen Plot Aufruf wird nur ein Argument, das \code{y}, an die -Funktion \code{plot} \"ubergeben. \code{plot} erh\"alt nur die +Im obigen Plot Aufruf wird nur ein Argument, das \varcode{y}, an die +Funktion \code{plot()} \"ubergeben. \code{plot()} erh\"alt nur die y-Werte. \matlab{} substituiert in diesem Fall die fehlenden x-Werte, indem eine Schrittweite von 1 angenommen wird. Die x-Achse reicht also -von 1 bis zur L\"ange des Vektors \code{y}. Diese Skalierung der +von 1 bis zur L\"ange des Vektors \varcode{y}. Diese Skalierung der x-Achse ist nur in den wenigsten F\"allen erw\"unscht. Besser ist es, die zugeh\"origen x-Werte explixit zu \"ubergeben und so z.B. die -y-Werte als Funktion der Zeit darzustellen (\code{plot(x, y)}). +y-Werte als Funktion der Zeit darzustellen (\code[plot()]{plot(x, y)}). Standard\"a{\ss}ig wird der erste Lininenplot in blau, mit durchgezogener Linie, ohne Marker und der Strichst\"arke 1 dargestellt. Der zweite Linienplot erh\"alt automatisch die Farbe @@ -291,11 +291,11 @@ die Farbe und die verschiedenen Marker. \subsection{Ver\"andern von Linieneigenschaften} Die Eigenschaften des Linienplots k\"onnen \"uber weitere Argumente -des \code{plot} Befehls ver\"andert werden. Folgender Aufruf (Listing +der \code{plot()} Funktion ver\"andert werden. Folgender Aufruf (Listing \ref{settinglineprops})erzeugt einen roten Linienplot mit gepunkteter Linie der St\"arke 1.5 und Sternmarkern an den Positionen der Datenpunkte. Zus\"atzlich wird noch die Eigenschaft -\codeterm{displayname} gesetzt, um dem Linienplot einen Namen zu +\code{displayname} gesetzt, um dem Linienplot einen Namen zu geben, der in einer Legende verwendet werden kann. \begin{lstlisting}[label=settinglineprops, caption={Setzen von Linieneigenschaften beim \varcode{plot} Aufruf}] @@ -307,46 +307,47 @@ geben, der in einer Legende verwendet werden kann. \subsection{Ver\"andern von Achseneigenschaften} Das erste, was ein Plot zus\"atzlich braucht, ist eine -Achsenbeschriftung. Mithilfe der Funktionen \code{xlabel('Time [ms]')} -und \code{ylabel('Voltage [V]')} k\"onnen diese gesetzt +Achsenbeschriftung. Mithilfe der Funktionen \code[xlabel()]{xlabel('Time [ms]')} +und \code[ylabel()]{ylabel('Voltage [V]')} k\"onnen diese gesetzt werden. Standardm\"a{\ss}ig setzt Matlab die Grenzen der x- und y-Achse so, dass die Daten hineinpassen. Dabei wird meist auf den n\"achsten -ganzzahligen Wert aufgerundet. Mit den Funktionen \code{xlim} und -\code{ylim} k\"onnen die Grenezen der Achsen aber auch manuell -eingestellt werden. Die Funktionen \code{xlim} und \code{ylim} +ganzzahligen Wert aufgerundet. Mit den Funktionen \code{xlim()} und +\code{ylim()} k\"onnen die Grenezen der Achsen aber auch manuell +eingestellt werden. Die Funktionen \code{xlim()} und \code{ylim()} erwarten als Argument einen 2-elementigen Vektor mit dem Minimum und dem Maximum der jeweiligen Achse. Tabelle \ref{plotaxisprops} listet -weitere h\"aufig genutzte Einstellungen der Achsen. Mit der \code{set} -- Funktion k\"onnen diese ver\"andert werden wie in Zeile 15 in -Listing \ref{niceplotlisting} gezeigt. Die \code{set} - Funktion -erwartet als erstes Argument ein sogenanntes Handle der Achse, dieses -wird gefolgt von einer beliebig langen Reihe von Eigenschaft-Wert -Paaren. Soll z.B. das Gitternetz der x-Achse gezeigt werden, wird die -Eigenschaft \codeterm{XGrid} auf den Wert \codeterm{'on'} gesetzt: -\code{set(gca, 'XGrid', 'on');}. Das erste Argument ist ein Aufruf der -Funktion \code{gca}, ``get-current-axis'' und ist das Achsenhandle der -gerade aktiven Achse. +weitere h\"aufig genutzte Einstellungen der Achsen. Mit der +\code{set()} - Funktion k\"onnen diese ver\"andert werden wie in Zeile +15 in Listing \ref{niceplotlisting} gezeigt. Die \code{set()} - +Funktion erwartet als erstes Argument ein sogenanntes Handle der +Achse, dieses wird gefolgt von einer beliebig langen Reihe von +Eigenschaft-Wert Paaren. Soll z.B. das Gitternetz der x-Achse gezeigt +werden, wird die Eigenschaft \code{XGrid} auf den Wert +\varcode{'on'} gesetzt: \code[set()!set(gca, 'XGrid', +'on')]{set(gca, 'XGrid', 'on');}. Das erste Argument ist ein Aufruf +der Funktion \code{gca}, \enterm{get-current-axis} und ist das Achsenhandle +der gerade aktiven Achse. \begin{table}[tp] - \titlecaption{Ausgew\"ahlte Eigenschaften der Achse.}{ Alle Eigenschaften der Achse findet man in der Hilfe oder im \codeterm{Property Editor} (\figref{ploteditorfig}). Wenn es eine definierte Auswahl von Einstellungen gibt, z.B. bei der Eigenschaft \codeterm{Box}, dann ist die Standardeinstellungen als erstes gelistet.}\label{plotaxisprops} + \titlecaption{Ausgew\"ahlte Eigenschaften der Achse.}{ Alle Eigenschaften der Achse findet man in der Hilfe oder im \codeterm{Property Editor} (\figref{ploteditorfig}). Wenn es eine definierte Auswahl von Einstellungen gibt, z.B. bei der Eigenschaft \code{Box}, dann ist die Standardeinstellungen als erstes gelistet.}\label{plotaxisprops} \begin{tabular*}{1\textwidth}{lp{6.3cm}p{6cm}} \hline \textbf{Eigenschaft} & \textbf{Beschreibung} & \textbf{Optionen} \\ \hline - \codeterm{Box} & Definiert, ob der Rahmen der Achse vollst\"andig gezeichnet wird. & $\{'on'|'off'\}$ \\ - \codeterm{Color} & Hintergrundfarbe des Koordinatensystems. & Beliebige RGB, CMYK ... Werte. \\ - \codeterm{Fontname} & Der Name der Schriftart. & Im System installierte Schriften. \\ - \codeterm{FontSize} & Gr\"o{\ss}e der Schrift. & Skalarer Wert.\\ - \codeterm{FontUnit} & Einheit, in der die Schriftgr\"o{\ss}e bestimmt wird. & $\{'points' | 'centimeters' | 'inches', ...\}$\\ - \codeterm{FontWeight} & Fett- oder Normalsatz der Schrift. & $\{'normal' | 'bold'\}$\\ + \code{Box} & Definiert, ob der Rahmen der Achse vollst\"andig gezeichnet wird. & $\{'on'|'off'\}$ \\ + \code{Color} & Hintergrundfarbe des Koordinatensystems. & Beliebige RGB, CMYK ... Werte. \\ + \code{Fontname} & Der Name der Schriftart. & Im System installierte Schriften. \\ + \code{FontSize} & Gr\"o{\ss}e der Schrift. & Skalarer Wert.\\ + \code{FontUnit} & Einheit, in der die Schriftgr\"o{\ss}e bestimmt wird. & $\{'points' | 'centimeters' | 'inches', ...\}$\\ + \code{FontWeight} & Fett- oder Normalsatz der Schrift. & $\{'normal' | 'bold'\}$\\ % & 'd' \\ ?????? - \codeterm{TickDir} & Richtung der Teilstriche auf der Achse. & $\{'in' | 'out'\}$\\ - \codeterm{TickLength} & L\"ange der Haupt- und Nebenteilstriche & \\ - \codeterm{X-, Y-, ZDir} & Richtung der Achsskalierung. & $\{'normal' | 'reversed'\}$\\ - \codeterm{X-, Y-, ZGrid} & Sollen Gitternetzlinien gezeigt werden? & $\{'off'|'on'\}$ \\ - \codeterm{X-, Y-, ZScale} & Lineare oder logarithmische Skalierung der Achse. & $\{'linear' | 'log'\}$\\ - \codeterm{X-, Y-, ZTick} & Position der Teilstriche auf der Achse. & Vektor mit Positionen.\\ - \codeterm{X-, Y-, ZTickLabel} & Beschriftung der Teilstriche. & Vektor mit entsprechenden Zahlen oder Cell-Array mit Strings.\\ \hline + \code{TickDir} & Richtung der Teilstriche auf der Achse. & $\{'in' | 'out'\}$\\ + \code{TickLength} & L\"ange der Haupt- und Nebenteilstriche & \\ + \code{X-, Y-, ZDir} & Richtung der Achsskalierung. & $\{'normal' | 'reversed'\}$\\ + \code{X-, Y-, ZGrid} & Sollen Gitternetzlinien gezeigt werden? & $\{'off'|'on'\}$ \\ + \code{X-, Y-, ZScale} & Lineare oder logarithmische Skalierung der Achse. & $\{'linear' | 'log'\}$\\ + \code{X-, Y-, ZTick} & Position der Teilstriche auf der Achse. & Vektor mit Positionen.\\ + \code{X-, Y-, ZTickLabel} & Beschriftung der Teilstriche. & Vektor mit entsprechenden Zahlen oder Cell-Array mit Strings.\\ \hline \end{tabular*} \end{table} @@ -357,16 +358,16 @@ gerade aktiven Achse. \titlecaption{Ausgew\"ahlte Eigenschaften der \codeterm{Figure}.}{Alle Eigenschaften der Figure findet man in der Hilfe von \matlab{} oder im \codeterm{Property Editor} wenn die Abbildung ausgew\"ahlt wurde (\figref{ploteditorfig}).}\label{plotfigureprops} \begin{tabular*}{1\textwidth}{lp{6.3cm}p{6cm}} \hline \textbf{Eigenschaft} & \textbf{Beschreibung} & \textbf{Optionen} \\ \hline - \codeterm{Color} & Hintergrundfarbe der Zeichenfl\"ache. & Beliebige RGB, CMYK ... Werte. \\ - \codeterm{PaperPosition} & Position der Abbildung auf dem Papier & 4-elementiger Vektor mit den Positionen der linken-unteren, und rechten-oberen Ecke. \\ - \codeterm{PaperSize} & Gr\"o{\ss}e der des Papiers. & 2-elementiger Vektor mit der Papiergr\"o{\ss}e.\\ - \codeterm{PaperUnits} & Einheit, in der die Papiergr\"o{\ss}e bestimmt wird. & $\{'inches' | 'centimeters' | 'normalized' | 'points'\}$\\ - \codeterm{Visible} & Hilfreich, wenn ein Plot aus Performanzgr\"unden nicht auf dem Bildschirm gezeigt, sondern direkt gespeichert werden soll. & $\{'on' | 'off'\}$\\ \hline + \code{Color} & Hintergrundfarbe der Zeichenfl\"ache. & Beliebige RGB, CMYK ... Werte. \\ + \code{PaperPosition} & Position der Abbildung auf dem Papier & 4-elementiger Vektor mit den Positionen der linken-unteren, und rechten-oberen Ecke. \\ + \code{PaperSize} & Gr\"o{\ss}e der des Papiers. & 2-elementiger Vektor mit der Papiergr\"o{\ss}e.\\ + \code{PaperUnits} & Einheit, in der die Papiergr\"o{\ss}e bestimmt wird. & $\{'inches' | 'centimeters' | 'normalized' | 'points'\}$\\ + \code{Visible} & Hilfreich, wenn ein Plot aus Performanzgr\"unden nicht auf dem Bildschirm gezeigt, sondern direkt gespeichert werden soll. & $\{'on' | 'off'\}$\\ \hline \end{tabular*} \end{table} Wie die Achse, hat auch das \codeterm{Figure} Element eine Reihe von -Eigenschaften, die nach Bedarf mit der \code{set} - Funktion gesetzt +Eigenschaften, die nach Bedarf mit der \code{set()} - Funktion gesetzt werden k\"onnen (Tabelle \ref{plotfigureprops} listet die meistverwendeten). Das erste Argument f\"ur \code{set()} ist jetzt aber eine Handle f\"ur die Abbildung, nicht das @@ -380,7 +381,7 @@ Aufruf des Skripts wird exakt der gleiche Plot (Abbildung sind hier vor allem die Zeilen 2 und 3 in denen die Gr\"o{\ss}e der Abbildung in Zentimetern definiert wird. In Zeile 16 wird die Abbildung dann in genau der angegebenen Gr\"o{\ss}e im ``pdf'' Format -gespeichert. Dazu wird die Funktion \code{saveas} verwendet, die als +gespeichert. Dazu wird die Funktion \code{saveas()} verwendet, die als erstes Argument wieder ein Handle auf die Figure erwartet. Das zweite Argument ist der Dateiname, und zuletzt muss das gew\"unschte Format (Box \ref{graphicsformatbox}) angegeben werden. @@ -423,10 +424,10 @@ Homepage viele Beispiele mit zugeh\"origem Code \end{minipage} \hfill \begin{minipage}[t]{0.5\textwidth} - Von \matlab{} unterst\"utzte Formate\footnote{Auswahl, mehr Information in der Hilfe zu \code{saveas}}:\\[2ex] + Von \matlab{} unterst\"utzte Formate\footnote{Auswahl, mehr Information in der Hilfe zu \code{saveas()}}:\\[2ex] \begin{tabular}{|l|c|l|} \hline - \textbf{Format} & \textbf{Typ} & \code{saveas} Argument \rule[-1.2ex]{0pt}{3.5ex} \\ \hline + \textbf{Format} & \textbf{Typ} & \code{saveas()} Argument \rule[-1.2ex]{0pt}{3.5ex} \\ \hline pdf & Vektor & \varcode{'pdf'} \rule{0pt}{2.5ex} \\ eps & Vektor & \varcode{'eps'}, \varcode{'epsc'} \\ SVG & Vektor & \varcode{'svg'} \\ diff --git a/pointprocesses/lecture/pointprocesses-chapter.tex b/pointprocesses/lecture/pointprocesses-chapter.tex index abbf168..70de527 100644 --- a/pointprocesses/lecture/pointprocesses-chapter.tex +++ b/pointprocesses/lecture/pointprocesses-chapter.tex @@ -5,8 +5,8 @@ \lstset{inputpath=../code} \graphicspath{{figures/}} -\setcounter{page}{} -\setcounter{chapter}{-1} +\setcounter{page}{111} +\setcounter{chapter}{7} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% diff --git a/pointprocesses/lecture/pointprocesses.tex b/pointprocesses/lecture/pointprocesses.tex index 7249097..88a718a 100644 --- a/pointprocesses/lecture/pointprocesses.tex +++ b/pointprocesses/lecture/pointprocesses.tex @@ -2,7 +2,7 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \chapter{Analyse von Spiketrains} -\determ{Aktionspotentiale} (\enterm{Spikes}) sind die Tr\"ager der +\determ[Aktionspotential]{Aktionspotentiale} (\enterm{Spikes}) sind die Tr\"ager der Information in Nervensystemen. Dabei ist in erster Linie nur der Zeitpunkt des Auftretens eines Aktionspotentials von Bedeutung. Die genaue Form des Aktionspotentials spielt keine oder nur eine @@ -16,7 +16,7 @@ es ergeben sich mehrere \enterm{trials} von Spiketrains Spiketrains sind Zeitpunkte von Ereignissen --- den Aktionspotentialen --- und deren Analyse f\"allt daher in das Gebiet der Statistik von -sogenannten \determ{Punktprozessen}. +sogenannten \determ[Punktprozess]{Punktprozessen}. \begin{figure}[ht] \includegraphics[width=1\textwidth]{rasterexamples} @@ -345,9 +345,10 @@ generiert wurden. W\"ahrend die Instantane Rate den Kehrwert der Zeit von einem bis zum n\"achsten Aktionspotential misst, sch\"atzt das sogenannte \determ{Peri-Stimulus-Zeit-Histogramm} (\enterm{peri stimulus time - histogram}, PSTH) die Wahrscheinlichkeit ab, zu einem Zeitpunkt -Aktionspotentiale anzutreffen. Es wird versucht die mittlere Rate \eqnref{firingrate} -im Grenzwert kleiner Beobachtungszeiten abzusch\"atzen: + histogram}, \determ[PSTH|see{Peri-Stimulus-Zeit-Histogramm}]{PSTH}) +die Wahrscheinlichkeit ab, zu einem Zeitpunkt Aktionspotentiale +anzutreffen. Es wird versucht die mittlere Rate \eqnref{firingrate} im +Grenzwert kleiner Beobachtungszeiten abzusch\"atzen: \begin{equation} \label{psthrate} r(t) = \lim_{W \to 0} \frac{\langle n \rangle}{W} \; , @@ -378,7 +379,7 @@ Abschnitte (Bins) eingeteilt und die Anzahl Aktionspotentiale, die in die jeweiligen Bins fallen, gez\"ahlt (\figref{binpsth} A). Um diese Z\"ahlungen in die Feuerrate umzurechnen muss noch mit der Binweite normiert werden. Das ist fast so, wie beim Absch\"atzen einer -Wahrscheinlichkeitsdichte. Es kann auch die \code{hist} Funktion zur +Wahrscheinlichkeitsdichte. Es kann auch die \code{hist()} Funktion zur Bestimmung des PSTHs verwendet werden. Die bestimmte Feuerrate gilt f\"ur das gesamte Bin (\figref{binpsth} @@ -439,7 +440,7 @@ Spiketrains. Die graphischer Darstellung der Feuerrate allein reicht nicht aus um den Zusammenhang zwischen neuronaler Antwort und einem Stimulus zu analysieren. Eine Methode um mehr \"uber diesen Zusammenhang zu erfahren, -ist der \enterm{Spike-triggered average} (STA). Der STA +ist der \enterm{Spike-triggered average} (\enterm[STA|see{Spike-triggered average}]{STA}). Der STA \begin{equation} STA(\tau) = \langle s(t - \tau) \rangle = \frac{1}{N} \sum_{i=1}^{N} s(t_i - \tau) \end{equation} @@ -477,12 +478,12 @@ antworten. Der STA kann auch dazu benutzt werden, aus den Antworten der Zelle den Stimulus zu rekonstruieren (\figref{stafig} B). Bei der -\determ{invertierten Rekonstruktion} wird die Zellantwort mit dem STA -verfaltet. +\determ[invertierte Rekonstruktion]{invertierten Rekonstruktion} wird +die Zellantwort mit dem STA verfaltet. \begin{exercise}{spikeTriggeredAverage.m}{} Implementiere eine Funktion, die den STA ermittelt. Verwende dazu - den Datensatz \codeterm{sta\_data.mat}. Die Funktion sollte folgende + den Datensatz \file{sta\_data.mat}. Die Funktion sollte folgende R\"uckgabewerte haben: \begin{itemize} \item den Spike-Triggered-Average. @@ -495,7 +496,7 @@ verfaltet. Rekonstruiere den Stimulus mithilfe des STA und der Spike Zeiten. Die Funktion soll Vektor als R\"uckgabewert haben, der genauso gro{\ss} ist wie der Originalstimulus aus der Datei - \codeterm{sta\_data.mat}. + \file{sta\_data.mat}. \end{exercise} diff --git a/programming/lecture/programming.tex b/programming/lecture/programming.tex index 05548b0..ff1d646 100644 --- a/programming/lecture/programming.tex +++ b/programming/lecture/programming.tex @@ -199,7 +199,7 @@ Dimension die Gr\"o{\ss}e 1 hat. Im Gegensatz zu Variablen, die einzelene Werte beinhalten (Skalare), kann ein Vektor mehrere Werte des gleichen Datentyps -beinhalten (Abbildung \ref{vectorfig} B). Die Variable \code{a} +beinhalten (Abbildung \ref{vectorfig} B). Die Variable \varcode{a} enth\"alt im Beispiel in Abbildung \ref{vectorfig} vier ganzzahlige Werte. \begin{figure} @@ -228,10 +228,10 @@ k\"onnen. 0 2 4 6 8 10 \end{lstlisting} Die L\"ange eines Vektors, d.h. die Anzahl der Elemente des Vektors, -kann mithilfe der Funktionen \code{length()} und \code{numel} bestimmt +kann mithilfe der Funktionen \code{length()} und \code{numel()} bestimmt werden. \"Ahnliche Information kann \"uber die Funktion \code{size()} erhalten werden (Listing \ref{arrayListing2}). Im Falle des Vektors -\code{a} von oben erh\"alt man folgende Ausgabe: +\varcode{a} von oben erh\"alt man folgende Ausgabe: \begin{lstlisting}[label=arrayListing2, caption={Gr\"o{\ss}e von Vektoren.}] >> length(a) @@ -244,7 +244,7 @@ erhalten werden (Listing \ref{arrayListing2}). Im Falle des Vektors Diese Ausgabe zeigt, dass Vektoren im Grunde 2-dimensional sind. Bei einem Zeilenvektor hat die erste Dimension die Gr\"o{\ss}e -1. \code{length(a)} gibt die l\"angste Ausdehnung an. Der \code{'}- +1. \code[length()]{length(a)} gibt die l\"angste Ausdehnung an. Der \code{'}- Operator transponiert den Spaltenvektor zu einem Zeilenvektor (Zeilen 14 ff.). @@ -323,7 +323,7 @@ Element gleichzeitig zuzugreifen. \end{lstlisting} \begin{exercise}{vectorsize.m}{vectorsize.out} - Der R\"uckgabewert von \code{size(a)} ist wieder ein Vektor der + Der R\"uckgabewert von \code[size()]{size(a)} ist wieder ein Vektor der L\"ange 2. Wie k\"onnte man also die Gr\"o{\ss}e von \varcode{a} in der zweiten Dimension herausfinden? \end{exercise} @@ -470,14 +470,14 @@ einzelnen Zeilen der Matrize. Zur Defintion von mehr-dimensionalen Matrizen ist die Notation in Zeile 1 nicht geeignet. Es gibt allerdings eine Reihe von Helferfunktionen, die n-dimensionale Matrizen erstellen k\"onnen -(z.B. \code{ones}, Zeile 7). Sollte sich die Notwendigkeit ergeben -mehrdimensionale Matrizen zusammenzuf\"ugen hilft die \code{cat} +(z.B. \code{ones()}, Zeile 7). Sollte sich die Notwendigkeit ergeben +mehrdimensionale Matrizen zusammenzuf\"ugen hilft die \code{cat()} Funktion. Um Informationen \"uber die Gr\"o{\ss}e einer Matrize zu bekommen ist -die Funktion \code{length} nicht geeignet. Wie oben erw\"ahnt gibt sie +die Funktion \code{length()} nicht geeignet. Wie oben erw\"ahnt gibt sie die Gr\"o{\ss}e der l\"angsten Dimension aus. Wann immer es um -Matrizen geht, wird \code{size} benutzt. +Matrizen geht, wird \code{size()} benutzt. \begin{figure} \includegraphics[width=0.9\columnwidth]{matrixIndexing} @@ -524,7 +524,7 @@ Alternativ zum \codeterm{subscript indexing} k\"onnen die Zellen einer Matrize auch \emph{linear} angesprochen werden (Abbildung \ref{matrixlinearindexingfig}). Diese Art der Adressierung ist nicht so intuitiv verst\"andlich, kann aber sehr hilfreich sein. Der -``linare'' Index einer Zelle reicht von 1 bis \code{numel(M)} +``linare'' Index einer Zelle reicht von 1 bis \code[numel()]{numel(M)} Elemente. Wobei dieser erst entlang der 1. Dimension, dann der 2., 3. etc. Dimension ansteigt. Listing \ref{matrixLinearIndexing} zeigt ein Beispiel f\"ur den Einsatz des linearen Indizierens z.B. wenn man @@ -682,7 +682,7 @@ zu wahr oder falsch ausgewertet werden wird. Wenn zwei Aussagen mit einem UND verkn\"upft werden und der erste zu falsch ausgewertet wird, muss der zweite gar nicht mehr gepr\"uft werden. Die Verwendung der ``short-circuit'' Versionen spart Rechenzeit. Das auschlie{\ss}ende ODER -(XOR) ist in \matlab{} nur als Funktion \code{xor(A, B)} verf\"ugbar. +(XOR) ist in \matlab{} nur als Funktion \code[xor()]{xor(A, B)} verf\"ugbar. \begin{table}[th] \titlecaption{\label{logicaloperators} @@ -935,7 +935,7 @@ end \begin{exercise}{facultyLoop.m}{facultyLoop.out} Wie k\"onnte Fakult\"at mit einer Schleife implementiert werden? Implementiere eine \code{for} Schleife, die die Fakul\"at von einer - Zahl \code{n} berechnet. + Zahl \varcode{n} berechnet. \end{exercise} @@ -1254,18 +1254,18 @@ hei{\ss}en soll, (ii) welche Information sie ben\"otigt und (iii) welche Daten sie zur\"uckliefern soll. \begin{enumerate} -\item \codeterm{Name:} der Name sollte beschreiben, was die Funktion +\item \codeterm{Name}: der Name sollte beschreiben, was die Funktion tut. In diesem Fall berechnet sie einen Sinus. Ein geeigneter Name - w\"are also \code{calculate\_sinewave}. -\item \codeterm{Argumente:} die zu brechnende Sinusschwingung sei durch + w\"are also \code{calculate\_sinewave()}. +\item \codeterm{Argumente}: die zu brechnende Sinusschwingung sei durch ihre Frequenz und die Amplitude bestimmt. Des Weiteren soll noch festgelegt werden, wie lang der Sinus sein soll und mit welcher zeitlichen Aufl\"osung gerechnet werden soll. Es werden also vier - Argumente ben\"otigt, sie k\"onnten hei{\ss}en: \code{amplitude}, - \code{frequency}, \code{t\_max}, \code{t\_step}. -\item \codeterm{R\"uckgabewerte:} Um den Sinus korrekt darstellen zu k\"onnen brauchen wir die + Argumente ben\"otigt, sie k\"onnten hei{\ss}en: \varcode{varamplitude}, + \varcode{frequency}, \varcode{t\_max}, \varcode{t\_step}. +\item \codeterm{R\"uckgabewerte}: Um den Sinus korrekt darstellen zu k\"onnen brauchen wir die Zeitachse und die entsprechenden Werte. Es werden also zwei - Variablen zur\"uckgegeben: \code{time, sine} + Variablen zur\"uckgegeben: \varcode{time}, \varcode{sine} \end{enumerate} Mit dieser Information ist es nun gut m\"oglich die Funktion zu implementieren (Listing \ref{sinefunctionlisting}). @@ -1289,7 +1289,7 @@ function [time, sine] = calculate_sinewave(frequency, amplitude, t_max, t_step) Diese Aufgabe kann auch von einer Funktion \"ubernommen werden. Diese Funktion hat keine andere Aufgabe, als die Daten zu plotten. Ihr Name sollte sich an dieser Aufgabe orientieren -(z.B. \code{plot\_sinewave}). Um einen einzelnen Sinus zu plotten +(z.B. \code{plot\_sinewave()}). Um einen einzelnen Sinus zu plotten werden im Wesentlichen die x-Werte und die zugeh\"origen y-Werte ben\"otigt. Da mehrere Sinus geplottet werden sollen ist es auch sinnvoll eine Zeichenkette f\"ur die Legende an die Funktion zu diff --git a/programmingstyle/lecture/programmingstyle-chapter.tex b/programmingstyle/lecture/programmingstyle-chapter.tex index 2ad3b5d..d82204d 100644 --- a/programmingstyle/lecture/programmingstyle-chapter.tex +++ b/programmingstyle/lecture/programmingstyle-chapter.tex @@ -5,7 +5,7 @@ \lstset{inputpath=../code} \graphicspath{{figures/}} -\setcounter{page}{55} +\setcounter{page}{57} \setcounter{chapter}{2} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% diff --git a/programmingstyle/lecture/programmingstyle.tex b/programmingstyle/lecture/programmingstyle.tex index d4f88a7..31187ce 100644 --- a/programmingstyle/lecture/programmingstyle.tex +++ b/programmingstyle/lecture/programmingstyle.tex @@ -136,10 +136,10 @@ 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 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 + dem Muster ``format2format'' (z.B. \code{num2str()} f\"ur die Konvertierung ``number to string'', Umwandlung eines numerischen Wertes in einen Text) benannt. \end{itemize} @@ -165,9 +165,9 @@ W\"ahrend die Namen von Funktionen und Skripten ihren Zweck beschreiben, sollten die Namen von Variablen ihren Inhalt beschreiben. Eine Variable, die die mittlere Anzahl von Aktionspotentialen speichert, k\"onnte also -\codeterm{average\_spike\_count} hei{\ss}en. Wenn die Variable nicht +\varcode{average\_spike\_count} hei{\ss}en. Wenn die Variable nicht nur einen sondern mehrere Werte aufnimmt, dann ist der Plural -angebracht (\codeterm{average\_spike\_counts}). +angebracht (\varcode{average\_spike\_counts}). Die Laufvariablen von \code{for}-Schleifen werden oft nur \varcode{i}, \varcode{j} oder \varcode{k} benannt und sollten aber die einzige Ausnahme @@ -175,7 +175,7 @@ bzgl. ausdrucksstarker Namensgebung bleiben. \begin{important}[Benennung von Variablen] Die Namen von Variablen sollten m\"oglichst viel \"uber ihren Inhalt - aussagen (\code{spike\_count} statt \code{x}). Gute Namen + aussagen (\varcode{spike\_count} statt \varcode{x}). Gute Namen f\"ur Variablen sind die beste Dokumentation. \end{important} @@ -248,7 +248,7 @@ Kommentarzeilen werden in \matlab{} mit dem Prozentzeichen \code{\%} gekennzeichnet. Gezielt und sparsam eingesetzte Kommentare sind f\"ur das Verst\"andnis eines Programms sehr n\"utzlich. Am wichtigsten sind kurze Kommentare, die den Zweck und das Ziel eines Abschnitts im -Programm erl\"autern (z.B. \code{\% compute mean firing rate over all +Programm erl\"autern (z.B. \varcode{\% compute mean firing rate over all trials}). Viele und h\"aufige Kommentare k\"onnen in der Entwicklungsphase eines @@ -259,7 +259,7 @@ Zeilen sowieso weitestgehend selbsterkl\"arend sein. Die beste Dokumentation ist der Code selbst. Gut geschriebener Code mit ausdrucksstarken Variablen- und Funktionsnamen ben\"otigt keine Kommentare, um den Zweck einzelner Zeilen zu erkl\"aren. z.B. ist\\ -\code{ x = x + 2; \% add two to x}\\ +\varcode{ x = x + 2; \% add two to x}\\ ein v\"ollig unn\"otiger Kommentar. \begin{important}[Verwendung von Kommentaren] @@ -333,10 +333,10 @@ lokale Funktion. Lokale Funktionen existieren in der gleichen Datei und sind nur dort verf\"ugbar. Jede Funktion hat ihren eigenen G\"ultigkeitsbereich, das hei{\ss}t, dass Variablen aus den aufrufenden Funktionen nicht -sichtbar sind. Bei sogenannten \codeterm{geschachtelten Funktionen} +sichtbar sind. Bei sogenannten \codeterm[geschachtelte Funktionen]{geschachtelten Funktionen} ist das anders. Diese werden innerhalb eines Funktionsk\"orpers -(zwischen den Schl\"usselworten \codeterm{function} und dem -\codeterm{end} definiert und k\"onnen auf alle Variablen der +(zwischen den Schl\"usselworten \code{function} und dem +\code{end} definiert und k\"onnen auf alle Variablen der ``Mutterfunktion'' zugreifen und diese auch ver\"andern. Folglich sollten sie nur mit Bedacht eingesetzt werden. diff --git a/regression/lecture/regression-chapter.tex b/regression/lecture/regression-chapter.tex index 9b9fc79..0df5e2b 100644 --- a/regression/lecture/regression-chapter.tex +++ b/regression/lecture/regression-chapter.tex @@ -5,7 +5,7 @@ \lstset{inputpath=../code} \graphicspath{{figures/}} -\setcounter{page}{85} +\setcounter{page}{89} \setcounter{chapter}{5} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% diff --git a/regression/lecture/regression.tex b/regression/lecture/regression.tex index 4cae7bd..fdb6906 100644 --- a/regression/lecture/regression.tex +++ b/regression/lecture/regression.tex @@ -81,7 +81,7 @@ quadratischen Abst\"ande immer positiv, unabh\"angig ob die Datenwerte zus\"atzlich gro{\ss}e Abst\"ande st\"arker gewichtet. \begin{exercise}{meanSquareError.m}{}\label{mseexercise}% - Schreibe eine Funktion \code{meanSquareError}, die die mittlere + Schreibe eine Funktion \code{meanSquareError()}, die die mittlere quadratische Abweichung zwischen einem Vektor mit den beobachteten Werten $y$ und einem Vektor mit den entsprechenden Vorhersagen $y^{est}$ berechnet.\newpage @@ -134,16 +134,16 @@ der Fehler \eqnref{mseline} minimal wird. \begin{exercise}{lsqError.m}{} Implementiere die Zielfunktion f\"ur die Optimierung mit der - linearen Geradengleichung als Funktion \code{lsqError}. + linearen Geradengleichung als Funktion \code{lsqError()}. \begin{itemize} \item Die Funktion \"ubernimmt drei Argumente: Das erste Argument - ist ein 2-elementiger Vektor, der die Parameter \code{m} und - \code{b} enth\"alt. Das zweite ist ein Vektor mit den $x$-Werten, + ist ein 2-elementiger Vektor, der die Parameter \varcode{m} und + \varcode{b} enth\"alt. Das zweite ist ein Vektor mit den $x$-Werten, an denen gemessen wurde, und das dritte ein Vektor mit den zugeh\"origen $y$-Werten. \item Die Funktion gibt als Ergebniss den Fehler als mittleren quadratischen Abstand \eqnref{mseline} zur\"uck. - \item Die Funktion soll die Funktion \code{meanSquareError} der + \item Die Funktion soll die Funktion \code{meanSquareError()} der vorherigen \"Ubung benutzen. \end{itemize} \end{exercise} @@ -181,12 +181,12 @@ beiden Parameter und auf der $z$-Achse der Fehlerwert aufgetragen \begin{exercise}{errorSurface.m}{}\label{errorsurfaceexercise}% Lade den Datensatz \textit{lin\_regression.mat} in den Workspace (20 - Datenpaare in den Vektoren \code{x} und \code{y}). Schreibe ein Skript + Datenpaare in den Vektoren \varcode{x} und \varcode{y}). Schreibe ein Skript \file{errorSurface.m}, dass den Fehler, berechnet als mittleren quadratischen Abstand zwischen den Daten und einer Geraden mit Steigung $m$ und $y$-Achsenabschnitt $b$, in Abh\"angigkeit von $m$ und $b$ als surface plot darstellt (siehe Hilfe f\"ur die - \code{surf} Funktion). + \code{surf()} Funktion). \end{exercise} An der Fehlerfl\"ache kann direkt erkannt werden, bei welcher @@ -310,7 +310,7 @@ partielle Ableitung nach $m$ durch \end{figure} \begin{exercise}{lsqGradient.m}{}\label{gradientexercise}% - Implementiere eine Funktion \code{lsqGradient}, die den + Implementiere eine Funktion \code{lsqGradient()}, die den Parametersatz $(m, b)$ der Geradengleichung als 2-elementigen Vektor sowie die $x$- und $y$-Werte der Messdaten als Argumente entgegennimmt und den Gradienten an dieser Stelle zur\"uckgibt. @@ -321,7 +321,7 @@ partielle Ableitung nach $m$ durch um f\"ur jede Parameterkombination aus der Fehlerfl\"ache (\"Ubung \ref{errorsurfaceexercise}) auch den Gradienten zu berechnen und darzustellen. Vektoren im Raum k\"onnen mithilfe der - Funktion \code{quiver} geplottet werden. + Funktion \code{quiver()} geplottet werden. \end{exercise} @@ -330,8 +330,8 @@ partielle Ableitung nach $m$ durch Zu guter Letzt muss nur noch der Gradientenabstieg implementiert werden. Die daf\"ur ben\"otigten Zutaten haben wir aus den vorangegangenen \"Ubungen bereits vorbereitet. Wir brauchen: 1. Die Fehlerfunktion -(\code{meanSquareError.m}), 2. die Zielfunktion (\code{lsqError.m}) -und 3. den Gradienten (\code{lsqGradient.m}). Der Algorithmus +(\code{meanSquareError()}), 2. die Zielfunktion (\code{lsqError()}) +und 3. den Gradienten (\code{lsqGradient()}). Der Algorithmus f\"ur den Abstieg lautet: \begin{enumerate} \item Starte mit einer beliebigen Parameterkombination $p_0 = (m_0, @@ -342,7 +342,7 @@ f\"ur den Abstieg lautet: abbrechen. Wir suchen ja das Minimum, bei dem der Gradient gleich Null ist. Da aus numerischen Gr\"unden der Gradient nie exakt Null werden wird, k\"onnen wir nur fordern, dass er hinreichend klein - wird (z.B. \code{norm(gradient) < 0.1}). + wird (z.B. \varcode{norm(gradient) < 0.1}). \item \label{gradientstep} Gehe einen kleinen Schritt ($\epsilon = 0.01$) in die entgegensetzte Richtung des Gradienten: \[p_{i+1} = p_i - \epsilon \cdot \nabla f_{cost}(m_i, b_i)\] @@ -367,7 +367,7 @@ Punkte in Abbildung \ref{gradientdescentfig} gro{\ss}. \begin{exercise}{gradientDescent.m}{} Implementiere den Gradientenabstieg f\"ur das Problem der Parameteranpassung der linearen Geradengleichung an die Messdaten in - der Datei \code{lin\_regression.mat}. + der Datei \file{lin\_regression.mat}. \begin{enumerate} \item Merke Dir f\"ur jeden Schritt den Fehler zwischen Modellvorhersage und Daten. @@ -388,7 +388,7 @@ mittlere quadratische Abstand als Kostenfunktion in der Tat ein einziges klar definiertes Minimum. Wie wir im n\"achsten Kapitel sehen werden, kann die Position des Minimums bei Geradengleichungen sogar analytisch bestimmt werden, der Gradientenabstieg w\"are also -gar nicht n\"otig \matlabfun{polyfit}. +gar nicht n\"otig \matlabfun{polyfit()}. F\"ur Parameter, die nichtlinear in einer Funktion enthalten sind, wie z.B. die Rate $\lambda$ als Parameter in der @@ -401,9 +401,9 @@ Gradientenabstiegs auf vielf\"altige Weise verbessert werden. z.B. kann die Schrittweite an die St\"arke des Gradienten angepasst werden. Diese numerischen Tricks sind in bereits vorhandenen Funktionen implementiert. Allgemeine Funktionen sind f\"ur beliebige -Kostenfunktionen gemacht \matlabfun{fminsearch}, w\"ahrend spezielle +Kostenfunktionen gemacht \matlabfun{fminsearch()}, w\"ahrend spezielle Funktionen z.B. f\"ur die Minimierung des quadratischen Abstands bei -einem Kurvenfit angeboten werden \matlabfun{lsqcurvefit}. +einem Kurvenfit angeboten werden \matlabfun{lsqcurvefit()}. \begin{important}[Achtung Nebenminima!] Das Finden des globalen Minimums ist leider nur selten so leicht wie diff --git a/scientificcomputing-script.tex b/scientificcomputing-script.tex index 3d090c5..4a4ce18 100644 --- a/scientificcomputing-script.tex +++ b/scientificcomputing-script.tex @@ -17,7 +17,6 @@ \lstlistoflistings \listofexercisefs \listofiboxfs -%\listofimportantfs %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \part{Grundlagen des Programmierens} @@ -71,7 +70,9 @@ \addcontentsline{toc}{chapter}{Fachbegriffe} \printindex[term] -\addcontentsline{toc}{chapter}{Code} +\addcontentsline{toc}{chapter}{Englische Fachbegriffe} +\printindex[enterm] +\addcontentsline{toc}{chapter}{MATLAB Code} \printindex[code] \end{document} diff --git a/statistics/lecture/statistics-chapter.tex b/statistics/lecture/statistics-chapter.tex index fa31714..ad93f38 100644 --- a/statistics/lecture/statistics-chapter.tex +++ b/statistics/lecture/statistics-chapter.tex @@ -5,7 +5,7 @@ \lstset{inputpath=../code} \graphicspath{{figures/}} -\setcounter{page}{67} +\setcounter{page}{69} \setcounter{chapter}{3} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% diff --git a/statistics/lecture/statistics.tex b/statistics/lecture/statistics.tex index 0e9569e..91c9775 100644 --- a/statistics/lecture/statistics.tex +++ b/statistics/lecture/statistics.tex @@ -43,8 +43,8 @@ nicht kleiner als der Median ist (\figref{medianfig}). \newpage \begin{exercise}{mymedian.m}{} - \tr{Write a function \code{mymedian} that computes the median of a vector.} - {Schreibe eine Funktion \code{mymedian}, die den Median eines Vektors zur\"uckgibt.} + \tr{Write a function \code{mymedian()} that computes the median of a vector.} + {Schreibe eine Funktion \code{mymedian()}, die den Median eines Vektors zur\"uckgibt.} \end{exercise} \matlab{} stellt die Funktion \code{median()} zur Berechnung des Medians bereit. @@ -55,7 +55,7 @@ nicht kleiner als der Median ist (\figref{medianfig}). returns a median above which are the same number of data than below. In particular the script should test data vectors of different length.} {Schreibe ein Skript, das testet ob die - \code{mymedian} Funktion wirklich die Zahl zur\"uckgibt, \"uber + \code{mymedian()} Funktion wirklich die Zahl zur\"uckgibt, \"uber der genauso viele Datenwerte liegen wie darunter. Das Skript sollte insbesondere verschieden lange Datenvektoren testen.} \end{exercise} @@ -126,8 +126,8 @@ Wahrscheinlichkeitsverteilung der Messwerte abzusch\"atzen. \tr{Plot histograms from rolling the die 20, 100, 1000 times. Use the plain hist(x) function, force 6 bins via hist( x, 6 ), and set meaningfull bins positions.} {Plotte Histogramme von 20, 100, und - 1000-mal w\"urfeln. Benutze \code{hist(x)}, erzwinge sechs Bins - mit \code{hist(x,6)}, oder setze selbst sinnvolle Bins. Normiere + 1000-mal w\"urfeln. Benutze \code[hist()]{hist(x)}, erzwinge sechs Bins + mit \code[hist()]{hist(x,6)}, oder setze selbst sinnvolle Bins. Normiere anschliessend das Histogram auf geeignete Weise.} \end{exercise} @@ -271,7 +271,7 @@ Korrelations\-koeffizient (x-\langle x \rangle)(y-\langle y \rangle) \rangle}{\sqrt{\langle (x-\langle x \rangle)^2} \rangle \sqrt{\langle (y-\langle y \rangle)^2} \rangle} \] -quantifiziert einfache lineare Zusammenh\"ange \matlabfun{corr}. Der +quantifiziert einfache lineare Zusammenh\"ange \matlabfun{corr()}. Der Korrelationskoeffizient ist die Covarianz normiert durch die Standardabweichungen. Perfekt korrelierte Variablen ergeben einen Korrelationskoeffizienten von $+1$, antikorrelierte Daten einen From 3225b28be48edd44993bbe919d3e5ae8788c545a Mon Sep 17 00:00:00 2001 From: Jan Benda Date: Mon, 23 Nov 2015 11:00:19 +0100 Subject: [PATCH 03/17] Improved indices --- bootstrap/lecture/bootstrap-chapter.tex | 2 +- bootstrap/lecture/bootstrap.tex | 51 ++++++----- .../lecture/designpattern-chapter.tex | 2 +- header.tex | 2 +- likelihood/lecture/likelihood-chapter.tex | 2 +- likelihood/lecture/likelihood.tex | 46 +++++----- plotting/lecture/plotting.tex | 16 ++-- pointprocesses/lecture/pointprocesses.tex | 90 ++++++++++--------- programming/lecture/programming.tex | 61 +++++++------ programmingstyle/lecture/programmingstyle.tex | 44 +++++---- regression/lecture/regression.tex | 15 ++-- statistics/lecture/statistics.tex | 50 ++++++----- 12 files changed, 204 insertions(+), 177 deletions(-) diff --git a/bootstrap/lecture/bootstrap-chapter.tex b/bootstrap/lecture/bootstrap-chapter.tex index 1a06199..7ecd9a5 100644 --- a/bootstrap/lecture/bootstrap-chapter.tex +++ b/bootstrap/lecture/bootstrap-chapter.tex @@ -5,7 +5,7 @@ \lstset{inputpath=../code} \graphicspath{{figures/}} -\setcounter{page}{77} +\setcounter{page}{81} \setcounter{chapter}{4} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% diff --git a/bootstrap/lecture/bootstrap.tex b/bootstrap/lecture/bootstrap.tex index f142de5..9f96e32 100644 --- a/bootstrap/lecture/bootstrap.tex +++ b/bootstrap/lecture/bootstrap.tex @@ -2,7 +2,7 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \chapter{\tr{Bootstrap Methods}{Bootstrap Methoden}} -Beim Bootstrap erzeugt man sich die Verteilung von Statistiken durch Resampling +Beim \determ{Bootstrap} erzeugt man sich die Verteilung von Statistiken durch Resampling aus der Stichprobe. Das hat mehrere Vorteile: \begin{itemize} \item Weniger Annahmen (z.B. muss eine Stichprobe nicht normalverteilt sein). @@ -21,21 +21,22 @@ aus der Stichprobe. Das hat mehrere Vorteile: \end{figure} Zur Erinnerung: In der Statistik interessieren wir uns f\"ur -Eigenschaften einer Grundgesamtheit. z.B. die mittlere L\"ange von -sauren Gurken (\figref{statisticalpopulationfig}). Aus der -Grundgesamtheit wird eine Stichprobe (simple random sample, SRS) -gezogen, da niemals die gesamte Grundgesamtheit gemessen werden kann. -Dann wird aus dieser einzigen Stichprobe die gew\"unschte Gr\"o{\ss}e -berechnet (die mittlere Gr\"o{\ss}e der sauren Gurken) und man hofft, -dass die erhaltene Zahl an der entsprechenden unbekannten Gr\"o{\ss}e -der Grundgesamtheit (der Populationsparameter) m\"oglichst nah dran +Eigenschaften einer \determ{Grundgesamtheit}. z.B. die mittlere +L\"ange von sauren Gurken (\figref{statisticalpopulationfig}). Aus der +Grundgesamtheit wird eine \determ{Stichprobe} (\enterm{simple random + sample}, \enterm[SRS|see{simple random sample}]{SRS}) gezogen, da +niemals die gesamte Grundgesamtheit gemessen werden kann. Dann wird +aus dieser einzigen Stichprobe die gew\"unschte Gr\"o{\ss}e berechnet +(die mittlere Gr\"o{\ss}e der sauren Gurken) und man hofft, dass die +erhaltene Zahl an der entsprechenden unbekannten Gr\"o{\ss}e der +Grundgesamtheit (der \determ{Populationsparameter}) m\"oglichst nah dran ist. Eine Aufgabe der Statistik ist es, herauszubekommen wie gut der Populationsparameter abgesch\"atzt worden ist. Wenn wir viele Stichproben ziehen w\"urden, dann k\"onnte man f\"ur jede Stichprobe den gew\"unschten Parameter berechnen, und von diesen die Wahrscheinlichkeitsverteilung \"uber ein Histogramm bestimmen --- -die ``Stichprobenverteilung'' (sampling distribution, +die \determ{Stichprobenverteilung} (\enterm{sampling distribution}, \subfigref{bootstrapsamplingdistributionfig}{a}). \begin{figure}[tp] @@ -68,9 +69,9 @@ Mittelwerte der Stichproben um den Populationsmittelwert streuen \subfigref{bootstrapsamplingdistributionfig}{b}). Wir k\"onnen aber auch aus der einen Stichprobe die wir haben durch -Resampling viele neue Stichproben generieren (Bootstrap). Von diesen +\determ{Resampling} viele neue Stichproben generieren (Bootstrap). Von diesen k\"onnen wir jeweils die gew\"unschte Gr\"o{\ss}e berechnen und ihre -Verteilung bestimmen (Bootstrap Verteilung, +Verteilung bestimmen (\determ{Bootstrapverteilung}, \subfigref{bootstrapsamplingdistributionfig}{c}). Diese Verteilung ist interessanterweise in ihrer Breite und Form der Stichprobenverteilung sehr \"ahnlich. Nur streut sie nicht um den Populationswert sonder um @@ -92,7 +93,7 @@ Stichprobe vorkommen. Am besten l\"asst sich die Bootstrap Methode am Beispiel des Standardfehlers des Mittelwertes veranschaulichen. Aus der Stichprobe -k\"onnen wir den Mittelwert berechnen. Der Standardfehler des +k\"onnen wir den Mittelwert berechnen. Der \determ{Standardfehler} des Mittelwerts gibt die Standardabweichung an, mit der wir erwarten, dass der gemessene Mittelwert um den Populationsmittelwert streut. @@ -147,7 +148,7 @@ Nullhypothese aus den Daten selbst gewonnen werden. Dabei m\"ussen die Daten entsprechend der Nullhypothese neu aus der Stichprobe gezogen werden. -Diese ``Permutationstests'' haben den Vorteil, dass nur die +Diese \determ{Permutationstests} haben den Vorteil, dass nur die Eigenschaft von Interesse zerst\"ort wird, um die Nullhypothese zu generieren. Alle anderen Eigenschaften der Daten bleiben erhalten. @@ -166,16 +167,18 @@ generieren. Alle anderen Eigenschaften der Daten bleiben erhalten. Sehr sch\"on lassen sich Permutationstest am Beispiel von Korrelationen veranschaulichen. Gegeben sind Datenpaare $(x_i, y_i)$. -Daraus k\"onnen wir den Korrelationskoeffizienten berechnen. Wir -wissen dann aber noch nicht, ob der berechnete Wert tats\"achlich eine -Korrelation anzeigt. Die Nullhypothese ist, dass die Daten nicht -miteinander korreliert sind. Indem wir die $x$-Werte und die $y$-Werte -unabh\"angig voneinander permutieren (ihre Reihenfolge zuf\"allig neu -anordnen), werden die Korrelationen der Datenpaare zerst\"ort. Wenn -wir das viele Male wiederholen, bekommen wir die Verteilung der -Korrelationskoeffizienten f\"ur nichtkorrelierte Daten. Aus dieser -Verteilung der Nullhypothese k\"onnen wir dann dann die Signifikanz -der tats\"achlich gemessenen Korrelation bestimmen. +Daraus k\"onnen wir den +\determ[Korrelationskoeffizient]{Korrelationskoeffizienten} +berechnen. Wir wissen dann aber noch nicht, ob der berechnete Wert +tats\"achlich eine Korrelation anzeigt. Die Nullhypothese ist, dass +die Daten nicht miteinander korreliert sind. Indem wir die $x$-Werte +und die $y$-Werte unabh\"angig voneinander permutieren (ihre +Reihenfolge zuf\"allig neu anordnen), werden die Korrelationen der +Datenpaare zerst\"ort. Wenn wir das viele Male wiederholen, bekommen +wir die Verteilung der Korrelationskoeffizienten f\"ur +nichtkorrelierte Daten. Aus dieser Verteilung der Nullhypothese +k\"onnen wir dann dann die Signifikanz der tats\"achlich gemessenen +Korrelation bestimmen. \begin{exercise}{correlationsignificance.m}{correlationsignificance.out} Bestimme die Signifikanz eines Korrelationskoeffizienten. diff --git a/designpattern/lecture/designpattern-chapter.tex b/designpattern/lecture/designpattern-chapter.tex index 0f3596c..23dfe21 100644 --- a/designpattern/lecture/designpattern-chapter.tex +++ b/designpattern/lecture/designpattern-chapter.tex @@ -5,7 +5,7 @@ \lstset{inputpath=../code} \graphicspath{{figures/}} -\setcounter{page}{125} +\setcounter{page}{129} \setcounter{chapter}{8} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% diff --git a/header.tex b/header.tex index 01414c8..50fef0d 100644 --- a/header.tex +++ b/header.tex @@ -191,7 +191,7 @@ %%%%% english, german, code and file terms: %%%%%%%%%%%%%%% \usepackage{ifthen} -\newcommand{\enterm}[2][]{``#2''\ifthenelse{\equal{#1}{}}{\protect\sindex[enterm]{#2}}{\protect\sindex[term]{#1}}} +\newcommand{\enterm}[2][]{``#2''\ifthenelse{\equal{#1}{}}{\protect\sindex[enterm]{#2}}{\protect\sindex[enterm]{#1}}} \newcommand{\determ}[2][]{\textit{#2}\ifthenelse{\equal{#1}{}}{\protect\sindex[term]{#2}}{\protect\sindex[term]{#1}}} \newcommand{\codeterm}[2][]{\textit{#2}\ifthenelse{\equal{#1}{}}{\protect\sindex[term]{#2}}{\protect\sindex[term]{#1}}} \newcommand{\file}[1]{\texttt{#1}} diff --git a/likelihood/lecture/likelihood-chapter.tex b/likelihood/lecture/likelihood-chapter.tex index 2f15436..0f74fe3 100644 --- a/likelihood/lecture/likelihood-chapter.tex +++ b/likelihood/lecture/likelihood-chapter.tex @@ -5,7 +5,7 @@ \lstset{inputpath=../code} \graphicspath{{figures/}} -\setcounter{page}{99} +\setcounter{page}{101} \setcounter{chapter}{6} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% diff --git a/likelihood/lecture/likelihood.tex b/likelihood/lecture/likelihood.tex index 62872f3..6a8e210 100644 --- a/likelihood/lecture/likelihood.tex +++ b/likelihood/lecture/likelihood.tex @@ -7,7 +7,8 @@ In vielen Situationen wollen wir einen oder mehrere Parameter $\theta$ einer Wahrscheinlichkeitsverteilung sch\"atzen, so dass die Verteilung die Daten $x_1, x_2, \ldots x_n$ am besten beschreibt. -Maximum-Likelihood-Sch\"atzer (maximum likelihood estimate, mle) +\determ{Maximum-Likelihood-Sch\"atzer} (\enterm{maximum likelihood + estimator}, \determ[mle|see{Maximum-Likelihood-Sch\"atzer}]{mle}) w\"ahlen die Parameter so, dass die Wahrscheinlichkeit, dass die Daten aus der Verteilung stammen, am gr\"o{\ss}ten ist. @@ -31,8 +32,10 @@ Auftretens der Werte $x_1, x_2, \ldots x_n$ gegeben ein bestimmtes $\theta$ p(x_1,x_2, \ldots x_n|\theta) = p(x_1|\theta) \cdot p(x_2|\theta) \ldots p(x_n|\theta) = \prod_{i=1}^n p(x_i|\theta) \; . \end{equation} -Andersherum gesehen ist das die Likelihood (deutsch immer noch ``Wahrscheinlichleit'') -den Parameter $\theta$ zu haben, gegeben die Me{\ss}werte $x_1, x_2, \ldots x_n$, +Andersherum gesehen ist das die \determ{Likelihood} +(\enterm{likelihood}, deutsch immer noch ``Wahrscheinlichleit'') den +Parameter $\theta$ zu haben, gegeben die Me{\ss}werte $x_1, x_2, +\ldots x_n$, \begin{equation} {\cal L}(\theta|x_1,x_2, \ldots x_n) = p(x_1,x_2, \ldots x_n|\theta) \end{equation} @@ -55,7 +58,7 @@ An der Stelle eines Maximums einer Funktion \"andert sich nichts, wenn man die Funktionswerte mit einer streng monoton steigenden Funktion transformiert. Aus numerischen und gleich ersichtlichen mathematischen Gr\"unden wird meistens das Maximum der logarithmierten Likelihood -(``Log-Likelihood'') gesucht: +(\determ{log-Likelihood}, \enterm{log-likelihood}) gesucht: \begin{eqnarray} \theta_{mle} & = & \text{argmax}_{\theta}\; {\cal L}(\theta|x_1,x_2, \ldots x_n) \nonumber \\ & = & \text{argmax}_{\theta}\; \log {\cal L}(\theta|x_1,x_2, \ldots x_n) \nonumber \\ @@ -73,7 +76,7 @@ $\theta$ maximiert dessen Likelhood? \begin{figure}[t] \includegraphics[width=1\textwidth]{mlemean} - \titlecaption{\label{mlemeanfig} Maximum Likelihood Estimation des + \titlecaption{\label{mlemeanfig} Maximum Likelihood Sch\"atzung des Mittelwerts.}{Oben: Die Daten zusammen mit drei m\"oglichen Normalverteilungen mit unterschiedlichen Mittelwerten (Pfeile) aus denen die Daten stammen k\"onnten. Unteln links: Die Likelihood @@ -121,7 +124,7 @@ diesem Mittelwert gezogen worden sind (\figref{mlemeanfig}). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{Kurvenfit als Maximum-Likelihood Sch\"atzung} -Beim Kurvenfit soll eine Funktion $f(x;\theta)$ mit den Parametern +Beim \determ{Kurvenfit} soll eine Funktion $f(x;\theta)$ mit den Parametern $\theta$ an die Datenpaare $(x_i|y_i)$ durch Anpassung der Parameter $\theta$ gefittet werden. Wenn wir annehmen, dass die $y_i$ um die entsprechenden Funktionswerte $f(x_i;\theta)$ mit einer @@ -210,21 +213,21 @@ zur\"uckzugreifen \matlabfun{lsqcurvefit()}. \section{Fits von Wahrscheinlichkeitsverteilungen} Jetzt betrachten wir noch den Fall, bei dem wir die Parameter einer Wahrscheinlichkeitsdichtefunktion (z.B. den shape-Parameter einer -Gamma-Verteilung) an ein Datenset fitten wollen. +\determ{Gamma-Verteilung}) an ein Datenset fitten wollen. Ein erster Gedanke k\"onnte sein, die -Wahrscheinlichkeitsdichtefunktion durch Minimierung des quadratischen -Abstands an ein Histogramm der Daten zu fitten. Das ist aber aus -folgenden Gr\"unden nicht die Methode der Wahl: (i) -Wahrscheinlichkeitsdichten k\"onnen nur positiv sein. Darum k\"onnen -insbesondere bei kleinen Werten die Daten nicht symmetrisch streuen, -wie es bei normalverteilten Daten der Fall ist. (ii) Die Datenwerte -sind nicht unabh\"angig, da das normierte Histogram sich zu Eins -aufintegriert. Die beiden Annahmen normalverteilte und unabh\"angige -Daten, die die Minimierung des quadratischen Abstands -\eqnref{chisqmin} zu einem Maximum-Likelihood Sch\"atzer machen, sind -also verletzt. (iii) Das Histogramm h\"angt von der Wahl der -Klassenbreite ab (\figref{mlepdffig}). +\determ[Wahrscheinlichkeitsdichte]{Wahrscheinlichkeitsdichtefunktion} +durch Minimierung des quadratischen Abstands an ein Histogramm der +Daten zu fitten. Das ist aber aus folgenden Gr\"unden nicht die +Methode der Wahl: (i) Wahrscheinlichkeitsdichten k\"onnen nur positiv +sein. Darum k\"onnen insbesondere bei kleinen Werten die Daten nicht +symmetrisch streuen, wie es bei normalverteilten Daten der Fall +ist. (ii) Die Datenwerte sind nicht unabh\"angig, da das normierte +Histogram sich zu Eins aufintegriert. Die beiden Annahmen +normalverteilte und unabh\"angige Daten, die die Minimierung des +quadratischen Abstands \eqnref{chisqmin} zu einem Maximum-Likelihood +Sch\"atzer machen, sind also verletzt. (iii) Das Histogramm h\"angt +von der Wahl der Klassenbreite ab (\figref{mlepdffig}). \begin{figure}[t] \includegraphics[width=1\textwidth]{mlepdf} @@ -259,8 +262,9 @@ Aktivit\"at Eigenschaften von sensorischen Stimuli. z.B. im visuellen Kortex V1 die Orientierung eines Balkens. Traditionell wird die Antwort der Neurone f\"ur verschiedene Stimuli (z.B. verschiedene Orientierungen des Balkens) gemessen. Die mittlere Antwort der Neurone -als Funktion eines Stimulusparameters ist dann die ``Tuning-curve'' -(z.B. Feuerrate als Funktion des Orientierungswinkels). +als Funktion eines Stimulusparameters ist dann die +\enterm{Tuning-curve} (deutsch \determ{Abstimmkurve}, z.B. Feuerrate +als Funktion des Orientierungswinkels). \begin{figure}[tp] \includegraphics[width=1\textwidth]{mlecoding} diff --git a/plotting/lecture/plotting.tex b/plotting/lecture/plotting.tex index 77456da..e1f4289 100644 --- a/plotting/lecture/plotting.tex +++ b/plotting/lecture/plotting.tex @@ -156,15 +156,15 @@ korrigiert werden musss, wird es schwierig und zeitaufwendig. Plots in \matlab{} bestehen aus mehreren Elementen: \begin{enumerate} -\item \enterm{Figure}: Dieses Element stellt die gesamte +\item \enterm[figure]{Figure}: Dieses Element stellt die gesamte Zeichenf\"ache, das Blatt Papier, dar. -\item \enterm{Axes}: Das Koordinatensystem in welches gezeichnet wird. -\item \enterm{Lines}: Die gezeichneten Datenplots wie Linien, +\item \enterm[axes]{Axes}: Das Koordinatensystem in welches gezeichnet wird. +\item \enterm[lines]{Lines}: Die gezeichneten Datenplots wie Linien, Fl\"achen, etc. -\item \enterm{Annotations}: Annotationen wie Textboxen oder auch - Pfeile, die zum Hervorheben von Punkten, oder Abschnitten gedacht - sind. -\item \enterm{Legends}: Legenden der Datenplots. +\item \enterm[annotations]{Annotations}: Annotationen wie Textboxen + oder auch Pfeile, die zum Hervorheben von Punkten, oder Abschnitten + gedacht sind. +\item \enterm[legends]{Legends}: Legenden der Datenplots. \end{enumerate} Jedes dieser Elemente bietet eine Vielzahl von Einstellungsm\"oglichkeiten. Wie schon erw\"ahnt, k\"onnen diese @@ -355,7 +355,7 @@ der gerade aktiven Achse. \subsection{Ver\"andern von Figure-Einstellungen} \begin{table}[tp] - \titlecaption{Ausgew\"ahlte Eigenschaften der \codeterm{Figure}.}{Alle Eigenschaften der Figure findet man in der Hilfe von \matlab{} oder im \codeterm{Property Editor} wenn die Abbildung ausgew\"ahlt wurde (\figref{ploteditorfig}).}\label{plotfigureprops} + \titlecaption{Ausgew\"ahlte Eigenschaften der \enterm[figure]{Figure}.}{Alle Eigenschaften der Figure findet man in der Hilfe von \matlab{} oder im \codeterm{Property Editor} wenn die Abbildung ausgew\"ahlt wurde (\figref{ploteditorfig}).}\label{plotfigureprops} \begin{tabular*}{1\textwidth}{lp{6.3cm}p{6cm}} \hline \textbf{Eigenschaft} & \textbf{Beschreibung} & \textbf{Optionen} \\ \hline \code{Color} & Hintergrundfarbe der Zeichenfl\"ache. & Beliebige RGB, CMYK ... Werte. \\ diff --git a/pointprocesses/lecture/pointprocesses.tex b/pointprocesses/lecture/pointprocesses.tex index 88a718a..a40e7d6 100644 --- a/pointprocesses/lecture/pointprocesses.tex +++ b/pointprocesses/lecture/pointprocesses.tex @@ -2,7 +2,7 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \chapter{Analyse von Spiketrains} -\determ[Aktionspotential]{Aktionspotentiale} (\enterm{Spikes}) sind die Tr\"ager der +\determ[Aktionspotential]{Aktionspotentiale} (\enterm{spikes}) sind die Tr\"ager der Information in Nervensystemen. Dabei ist in erster Linie nur der Zeitpunkt des Auftretens eines Aktionspotentials von Bedeutung. Die genaue Form des Aktionspotentials spielt keine oder nur eine @@ -10,7 +10,7 @@ untergeordnete Rolle. Nach etwas Vorverarbeitung haben elektrophysiologische Messungen deshalb Listen von Spikezeitpunkten als Ergebniss --- sogenannte -\enterm{Spiketrains}. Diese Messungen k\"onnen wiederholt werden und +\enterm{spiketrains}. Diese Messungen k\"onnen wiederholt werden und es ergeben sich mehrere \enterm{trials} von Spiketrains (\figref{rasterexamplesfig}). @@ -79,8 +79,9 @@ Zeitpunkte der Ereignisse durch senkrechte Striche markiert werden. Die Intervalle $T_i=t_{i+1}-t_i$ zwischen aufeinanderfolgenden Ereignissen sind reelle, positive Zahlen. Bei Aktionspotentialen -heisen die Intervalle auch \enterm{Interspikeintervalle}. Deren Statistik -kann mit den \"ublichen Gr\"o{\ss}en beschrieben werden. +heisen die Intervalle auch \determ{Interspikeintervalle} +(\enterm{interspike intervals}). Deren Statistik kann mit den +\"ublichen Gr\"o{\ss}en beschrieben werden. \begin{figure}[t] \includegraphics[width=1\textwidth]{isihexamples}\hfill @@ -104,9 +105,9 @@ kann mit den \"ublichen Gr\"o{\ss}en beschrieben werden. \frac{1}{n}\sum\limits_{i=1}^n T_i$. \item Standardabweichung der Intervalle: $\sigma_{ISI} = \sqrt{\langle (T - \langle T \rangle)^2 \rangle}$\vspace{1ex} -\item Variationskoeffizient (\enterm{coefficient of variation}): $CV_{ISI} = +\item \determ{Variationskoeffizient} (\enterm{coefficient of variation}): $CV_{ISI} = \frac{\sigma_{ISI}}{\mu_{ISI}}$. -\item Diffusions Koeffizient: $D_{ISI} = +\item \determ{Diffusionskoeffizient} (\enterm{diffusion coefficient}): $D_{ISI} = \frac{\sigma_{ISI}^2}{2\mu_{ISI}^3}$. \end{itemize} @@ -139,9 +140,10 @@ sichtbar. im Abstand des Lags $k$.} \end{figure} -Solche Ab\"angigkeiten werden durch die serielle Korrelation der -Intervalle quantifiziert. Das ist der Korrelationskoeffizient -zwischen aufeinander folgenden Intervallen getrennt durch lag $k$: +Solche Ab\"angigkeiten werden durch die \determ{serielle + Korrelationen} (\enterm{serial correlations}) der Intervalle +quantifiziert. Das ist der \determ{Korrelationskoeffizient} zwischen +aufeinander folgenden Intervallen getrennt durch lag $k$: \[ \rho_k = \frac{\langle (T_{i+k} - \langle T \rangle)(T_i - \langle T \rangle) \rangle}{\langle (T_i - \langle T \rangle)^2\rangle} = \frac{{\rm cov}(T_{i+k}, T_i)}{{\rm var}(T_i)} = {\rm corr}(T_{i+k}, T_i) \] \"Ublicherweise wird die Korrelation $\rho_k$ gegen den Lag $k$ @@ -170,10 +172,10 @@ durch folgende Sch\"atzer charakterisiert werden: \item Histogramm der counts $n_i$. \item Mittlere Anzahl von Ereignissen: $\mu_N = \langle n \rangle$. \item Varianz der Anzahl: $\sigma_n^2 = \langle (n - \langle n \rangle)^2 \rangle$. -\item Fano Faktor (Varianz geteilt durch Mittelwert): $F = \frac{\sigma_n^2}{\mu_n}$. +\item \determ{Fano Faktor} (Varianz geteilt durch Mittelwert): $F = \frac{\sigma_n^2}{\mu_n}$. \end{itemize} Insbesondere ist die mittlere Rate der Ereignisse $r$ (Spikes pro -Zeit, \determ{Feuerrate}) gemessen in Hertz +Zeit, \determ{Feuerrate}) gemessen in Hertz \sindex[term]{Feuerrate!mittlere Rate} \begin{equation} \label{firingrate} r = \frac{\langle n \rangle}{W} \; . @@ -209,18 +211,18 @@ u.a. wegen dem Zentralen Grenzwertsatz die Standardverteilung. Eine \"ahnliche Rolle spielt bei Punktprozessen der \determ{Poisson Prozess}. -Beim homogenen Poisson Prozess treten Ereignisse mit einer festen Rate -$\lambda=\text{const.}$ auf und sind unabh\"angig von der Zeit $t$ und -unabh\"angig von den Zeitpunkten fr\"uherer Ereignisse -(\figref{hompoissonfig}). Die Wahrscheinlichkeit zu irgendeiner Zeit -ein Ereigniss in einem kleinen Zeitfenster der Breite $\Delta t$ zu -bekommen ist +Beim \determ[Poisson Prozess!homogener]{homogenen Poisson Prozess} +treten Ereignisse mit einer festen Rate $\lambda=\text{const.}$ auf +und sind unabh\"angig von der Zeit $t$ und unabh\"angig von den +Zeitpunkten fr\"uherer Ereignisse (\figref{hompoissonfig}). Die +Wahrscheinlichkeit zu irgendeiner Zeit ein Ereigniss in einem kleinen +Zeitfenster der Breite $\Delta t$ zu bekommen ist \begin{equation} \label{hompoissonprob} P = \lambda \cdot \Delta t \; . \end{equation} -Beim inhomogenen Poisson Prozess h\"angt die Rate $\lambda$ von der -Zeit ab: $\lambda = \lambda(t)$. +Beim \determ[Poisson Prozess!inhomogener]{inhomogenen Poisson Prozess} +h\"angt die Rate $\lambda$ von der Zeit ab: $\lambda = \lambda(t)$. \begin{exercise}{poissonspikes.m}{} Schreibe eine Funktion \code{poissonspikes()}, die die Spikezeiten @@ -253,14 +255,15 @@ Der homogene Poissonprozess hat folgende Eigenschaften: \item Das mittlere Intervall ist $\mu_{ISI} = \frac{1}{\lambda}$ . \item Die Varianz der Intervalle ist $\sigma_{ISI}^2 = \frac{1}{\lambda^2}$ . \item Der Variationskoeffizient ist also immer $CV_{ISI} = 1$ . -\item Die seriellen Korrelationen $\rho_k =0$ f\"ur $k>0$, da das - Auftreten der Ereignisse unabh\"angig von der Vorgeschichte ist. Ein - solcher Prozess wird auch \determ{Erneuerungsprozess} genannt (\enterm{renewal - process}). -\item Die Anzahl der Ereignisse $k$ innerhalb eines Fensters der L\"ange W ist Poissonverteilt: +\item Die \determ[serielle Korrelationen]{seriellen Korrelationen} + $\rho_k =0$ f\"ur $k>0$, da das Auftreten der Ereignisse + unabh\"angig von der Vorgeschichte ist. Ein solcher Prozess wird + auch \determ{Erneuerungsprozess} genannt (\enterm{renewal process}). +\item Die Anzahl der Ereignisse $k$ innerhalb eines Fensters der + L\"ange W ist \determ[Poisson-Verteilung]{Poissonverteilt}: \[ P(k) = \frac{(\lambda W)^ke^{\lambda W}}{k!} \] (\figref{hompoissoncountfig}) -\item Der Fano Faktor ist immer $F=1$ . +\item Der \determ{Fano Faktor} ist immer $F=1$ . \end{itemize} \begin{exercise}{hompoissonspikes.m}{} @@ -322,18 +325,20 @@ Abbildung \ref{psthfig} n\"aher erl\"autert. \end{figure} Ein sehr einfacher Weg, die zeitabh\"angige Feuerrate zu bestimmen ist -die sogenannte \determ{instantane Feuerrate}. Dabei wird die Feuerrate -aus dem Kehrwert der Interspikeintervalle, der Zeit zwischen zwei -aufeinander folgenden Aktionspotentialen (\figref{instrate} A), -bestimmt. Die abgesch\"atzte Feuerrate (\figref{instrate} B) ist -g\"ultig f\"ur das gesammte Interspikeintervall. Diese Methode hat den -Vorteil, dass sie sehr einfach zu berechnen ist und keine Annahme -\"uber eine relevante Zeitskala (der Kodierung oder des -Auslesemechanismus der postsynaptischen Zelle) macht. $r(t)$ ist -allerdings keine kontinuierliche Funktion, die Spr\"unge in der -Feuerrate k\"onnen f\"ur manche Analysen nachteilig sein. Au{\ss}erdem -wird die Feuerrate nie gleich Null, auch wenn lange keine Aktionspotentiale -generiert wurden. +die sogenannte \determ[Feuerrate!instantane]{instantane Feuerrate} +(\enterm[firing rate!instantaneous]{instantaneous firing rate}). Dabei +wird die Feuerrate aus dem Kehrwert der Interspikeintervalle, der Zeit +zwischen zwei aufeinander folgenden Aktionspotentialen +(\figref{instrate} A), bestimmt. Die abgesch\"atzte Feuerrate +(\figref{instrate} B) ist g\"ultig f\"ur das gesammte +Interspikeintervall. Diese Methode hat den Vorteil, dass sie sehr +einfach zu berechnen ist und keine Annahme \"uber eine relevante +Zeitskala (der Kodierung oder des Auslesemechanismus der +postsynaptischen Zelle) macht. $r(t)$ ist allerdings keine +kontinuierliche Funktion, die Spr\"unge in der Feuerrate k\"onnen +f\"ur manche Analysen nachteilig sein. Au{\ss}erdem wird die Feuerrate +nie gleich Null, auch wenn lange keine Aktionspotentiale generiert +wurden. \begin{exercise}{instantaneousRate.m}{} Implementiere die Absch\"atzung der Feuerrate auf Basis der @@ -378,9 +383,9 @@ Bei der Binning-Methode wird die Zeitachse in gleichm\"aßige Abschnitte (Bins) eingeteilt und die Anzahl Aktionspotentiale, die in die jeweiligen Bins fallen, gez\"ahlt (\figref{binpsth} A). Um diese Z\"ahlungen in die Feuerrate umzurechnen muss noch mit der Binweite -normiert werden. Das ist fast so, wie beim Absch\"atzen einer +normiert werden. Das ist \"aquivalent zur Absch\"atzung einer Wahrscheinlichkeitsdichte. Es kann auch die \code{hist()} Funktion zur -Bestimmung des PSTHs verwendet werden. +Bestimmung des PSTHs verwendet werden. \sindex[term]{Feuerrate!Binningmethode} Die bestimmte Feuerrate gilt f\"ur das gesamte Bin (\figref{binpsth} B). Das so berechnete PSTH hat wiederum eine stufige Form, die von der @@ -422,7 +427,7 @@ wobei $\omega(\tau)$ der Filterkern und $\rho(t)$ die bin\"are Antwort ist. Bildlich geprochen wird jede 1 in $\rho(t)$ durch den Filterkern ersetzt (Abbildung \ref{convrate} A). Wenn der Kern richtig normiert wurde (Integral gleich Eins), ergibt sich die Feuerrate direkt aus der -\"Uberlagerung der Kerne (Abb. \ref{convrate} B). +\"Uberlagerung der Kerne (Abb. \ref{convrate} B). \sindex[term]{Feuerrate!Faltungsmethode} Die Faltungsmethode f\"uhrt, anders als die anderen Methoden, zu einer stetigen Funktion was insbesondere f\"ur spektrale Analysen von @@ -439,8 +444,9 @@ Spiketrains. \section{Spike-triggered Average} Die graphischer Darstellung der Feuerrate allein reicht nicht aus um den Zusammenhang zwischen neuronaler Antwort und einem Stimulus zu -analysieren. Eine Methode um mehr \"uber diesen Zusammenhang zu erfahren, -ist der \enterm{Spike-triggered average} (\enterm[STA|see{Spike-triggered average}]{STA}). Der STA +analysieren. Eine Methode um mehr \"uber diesen Zusammenhang zu +erfahren, ist der \enterm{spike-triggered average} +(\enterm[STA|see{spike-triggered average}]{STA}). Der STA \begin{equation} STA(\tau) = \langle s(t - \tau) \rangle = \frac{1}{N} \sum_{i=1}^{N} s(t_i - \tau) \end{equation} diff --git a/programming/lecture/programming.tex b/programming/lecture/programming.tex index ff1d646..1400ec0 100644 --- a/programming/lecture/programming.tex +++ b/programming/lecture/programming.tex @@ -913,17 +913,18 @@ Abschnitte wiederholt ausf\"uhren will. \subsubsection{Die \code{for} -- Schleife} Der am h\"aufigsten benutzte Vertreter der Schleifen ist die -\codeterm{for-Schleife}. Sie besteht aus dem \codeterm{Schleifenkopf} und -dem \codeterm{Schleifenk\"orper}. Der Kopf regelt, wie h\"aufig der Code -im K\"orper ausgef\"uhrt wird. Der Schleifenkopf beginnt mit dem -Schl\"usselwort \code{for} auf welches folgend die -\codeterm{Laufvariable} definiert wird. In \matlab ``l\"auft''/iteriert -eine for-Schleife immer(!) \"uber einen Vektor. Die -\codeterm{Laufvariable} nimmt mit jeder Iteration einen Wert dieses -Vektors an. Im Schleifenk\"orper k\"onnen beliebige Anweisungen -ausgef\"uhrt werden. Die Schleife wird durch das Schl\"usselwort -\code{end} beendet. Listing \ref{looplisting} zeigt das -Grundger\"ust einer for-Schleife. +\codeterm{for-Schleife}. Sie besteht aus dem +\codeterm[Schleife!Schleifenkopf]{Schleifenkopf} und dem +\codeterm[Schleife!Schleifenk{\"o}rper]{Schleifenk\"orper}. Der Kopf +regelt, wie h\"aufig der Code im K\"orper ausgef\"uhrt wird. Der +Schleifenkopf beginnt mit dem Schl\"usselwort \code{for} auf welches +folgend die \codeterm{Laufvariable} definiert wird. In \matlab +``l\"auft''/iteriert eine for-Schleife immer(!) \"uber einen +Vektor. Die \codeterm{Laufvariable} nimmt mit jeder Iteration einen +Wert dieses Vektors an. Im Schleifenk\"orper k\"onnen beliebige +Anweisungen ausgef\"uhrt werden. Die Schleife wird durch das +Schl\"usselwort \code{end} beendet. Listing \ref{looplisting} zeigt +das Grundger\"ust einer for-Schleife. \begin{lstlisting}[caption={Beispiel einer \varcode{for} Schleife. Die Laufvariable \varcode{x} nimmt mit jeder Iteration der Schleife einen Wert des Vektors \varcode{1:5} an.}, label=looplisting] for x = 1:5 @@ -1143,12 +1144,12 @@ wird, dann wird es Zeile f\"ur Zeile von oben nach unten ausgef\"uhrt. \matlab{} kennt drei Arten von Programmen: \begin{enumerate} -\item Skripte -\item Funktionen -\item Objekte (werden wir ignorieren) +\item \codeterm[Skript]{Skripte} +\item \codeterm[Funktion]{Funktionen} +\item \codeterm[Objekt]{Objekte} (werden wir hier nicht behandeln) \end{enumerate} Alle Programme werden in den sogenannten \codeterm{m-files} gespeichert -(z.B. \emph{meinProgramm.m}). Um sie zu benutzen werden sie von der +(z.B. \file{meinProgramm.m}). Um sie zu benutzen werden sie von der Kommandozeile aufgerufen oder in anderen Programmen verwendet. Programme erh\"ohen die Wiederverwertbarkeit von Programmcode. Bislang haben wir ausschlie{\ss}lich Skripte @@ -1161,7 +1162,7 @@ definierte Variable und weist ihr einen neuen Wert zu, dann kann das erw\"unscht und praktisch sein. Wenn es aber unbeabsichtigt passiert kann es zu Fehlern kommen, die nur sehr schwer erkennbar sind, da ja jedes Skript f\"ur sich enwandtfrei arbeitet. Eine L\"osung f\"ur -dieses Problem bieten die \codeterm{Funktionen}. +dieses Problem bieten die \codeterm[Funktion]{Funktionen}. \subsection{Funktionen} @@ -1254,18 +1255,20 @@ hei{\ss}en soll, (ii) welche Information sie ben\"otigt und (iii) welche Daten sie zur\"uckliefern soll. \begin{enumerate} -\item \codeterm{Name}: der Name sollte beschreiben, was die Funktion - tut. In diesem Fall berechnet sie einen Sinus. Ein geeigneter Name - w\"are also \code{calculate\_sinewave()}. -\item \codeterm{Argumente}: die zu brechnende Sinusschwingung sei durch - ihre Frequenz und die Amplitude bestimmt. Des Weiteren soll noch - festgelegt werden, wie lang der Sinus sein soll und mit welcher - zeitlichen Aufl\"osung gerechnet werden soll. Es werden also vier - Argumente ben\"otigt, sie k\"onnten hei{\ss}en: \varcode{varamplitude}, - \varcode{frequency}, \varcode{t\_max}, \varcode{t\_step}. -\item \codeterm{R\"uckgabewerte}: Um den Sinus korrekt darstellen zu k\"onnen brauchen wir die - Zeitachse und die entsprechenden Werte. Es werden also zwei - Variablen zur\"uckgegeben: \varcode{time}, \varcode{sine} +\item \codeterm[Funktion!Name]{Name}: der Name sollte beschreiben, was + die Funktion tut. In diesem Fall berechnet sie einen Sinus. Ein + geeigneter Name w\"are also \code{calculate\_sinewave()}. +\item \codeterm[Funktion!Argumente]{Argumente}: die zu brechnende + Sinusschwingung sei durch ihre Frequenz und die Amplitude + bestimmt. Des Weiteren soll noch festgelegt werden, wie lang der + Sinus sein soll und mit welcher zeitlichen Aufl\"osung gerechnet + werden soll. Es werden also vier Argumente ben\"otigt, sie k\"onnten + hei{\ss}en: \varcode{varamplitude}, \varcode{frequency}, + \varcode{t\_max}, \varcode{t\_step}. +\item \codeterm[Funktion!R{\"u}ckgabewerte]{R\"uckgabewerte}: Um den + Sinus korrekt darstellen zu k\"onnen brauchen wir die Zeitachse und + die entsprechenden Werte. Es werden also zwei Variablen + zur\"uckgegeben: \varcode{time}, \varcode{sine} \end{enumerate} Mit dieser Information ist es nun gut m\"oglich die Funktion zu implementieren (Listing \ref{sinefunctionlisting}). @@ -1309,7 +1312,7 @@ function plot_sinewave(x_data, y_data, name) \paragraph{III. Erstellen eines Skriptes zur Koordinierung} Die letzte Aufgabe ist die Koordinierung der Berechung und des Plottens f\"ur mehrere Amplituden. Das ist die klassische Aufgabe -f\"ur ein Skript. Auch hier gilt es einen ausdrucksvollen Name zu +f\"ur ein \codeterm{Skript}. Auch hier gilt es einen ausdrucksvollen Name zu finden. Da es keine Argumente und R\"uckgabewerte gibt, m\"ussen die ben\"otigten Informationen direkt in dem Skript defniniert werden. Es werden ben\"otigt: ein Vektor f\"ur die Amplituden, je eine Variable diff --git a/programmingstyle/lecture/programmingstyle.tex b/programmingstyle/lecture/programmingstyle.tex index 31187ce..e3714ac 100644 --- a/programmingstyle/lecture/programmingstyle.tex +++ b/programmingstyle/lecture/programmingstyle.tex @@ -302,7 +302,7 @@ ob dieser Teil des Programms nicht in eine eigene Funktion ausgelagert werden sollte. Fast immer kann dies bejaht werden. Abschnitte nicht auszulagern f\"uhrt zu sehr langen -\codeterm{m-Files}, die leicht un\"ubersichtlich werden. Diese Art von +\codeterm{m-files}, die leicht un\"ubersichtlich werden. Diese Art von Code wird \codeterm{Spaghetticode} genannt. Es ist h\"ochste Zeit \"uber Auslagerung in Funktionen nachzudenken. @@ -318,25 +318,28 @@ Code wird \codeterm{Spaghetticode} genannt. Es ist h\"ochste Zeit \subsection{Lokale Funktionen und geschachtelte Funktionen} -Das Auslagern von Funktionalit\"at in eigene Funktionen f\"uhrt -dazu, dass eine F\"ulle von Dateien erzeugt wird, die die +Das Auslagern von Funktionalit\"at in eigene Funktionen f\"uhrt dazu, +dass eine F\"ulle von Dateien erzeugt wird, die die \"Ubersichtlichkeit nicht unbedingt erh\"oht. Wenn die auszulagernde -Funktionalit\"at an vielen Stellen ben\"otigt wird ist es -dennoch sinnvoll dies zu tun. Wenn nicht, dann bietet \matlab{} die -M\"oglichkeit sogenannte \codeterm{lokale Funktionen} oder auch -\codeterm{geschachtelte Funktionen} (\enterm{nested functions}) zu -erstellen. Listing \ref{localfunctions} zeigt ein Beispiel f\"ur eine -lokale Funktion. +Funktionalit\"at an vielen Stellen ben\"otigt wird ist es dennoch +sinnvoll dies zu tun. Wenn nicht, dann bietet \matlab{} die +M\"oglichkeit sogenannte \codeterm[Funktion!lokale]{lokale Funktionen} +oder auch \codeterm[Funktion!geschachtelte|see{lokale}]{geschachtelte + Funktionen} (\enterm{nested functions}) zu erstellen. Listing +\ref{localfunctions} zeigt ein Beispiel f\"ur eine lokale Funktion. -\lstinputlisting[label=localfunctions, caption={Lokale Funktionen erh\"ohen die Lesbarkeit sind aber nur innerhalb der definierenden Datei verf\"ugbar.}]{calculate_sines.m} +\lstinputlisting[label=localfunctions, caption={Lokale Funktionen + erh\"ohen die Lesbarkeit sind aber nur innerhalb der definierenden + Datei verf\"ugbar.}]{calculate_sines.m} Lokale Funktionen existieren in der gleichen Datei und sind nur dort verf\"ugbar. Jede Funktion hat ihren eigenen G\"ultigkeitsbereich, das hei{\ss}t, dass Variablen aus den aufrufenden Funktionen nicht -sichtbar sind. Bei sogenannten \codeterm[geschachtelte Funktionen]{geschachtelten Funktionen} -ist das anders. Diese werden innerhalb eines Funktionsk\"orpers -(zwischen den Schl\"usselworten \code{function} und dem -\code{end} definiert und k\"onnen auf alle Variablen der +sichtbar sind. Bei sogenannten +\codeterm[Funktion!geschachtelte|see{lokale}]{geschachtelten + Funktionen} ist das anders. Diese werden innerhalb eines +Funktionsk\"orpers (zwischen den Schl\"usselworten \code{function} und +dem \code{end} definiert und k\"onnen auf alle Variablen der ``Mutterfunktion'' zugreifen und diese auch ver\"andern. Folglich sollten sie nur mit Bedacht eingesetzt werden. @@ -403,8 +406,11 @@ diese sollten dann beachtet werden. Wiederholte Programmabschnitte sollten in Funktionen ausgelagert werden. Wenn diese nicht von globalem Interesse sind, kann mit -\codeterm{lokalen} oder \codeterm{geschachtelten Funktionen} die -\"Ubersichtlichkeit erh\"oht werden. - -\noindent Es lohnt sich auf den eigenen Programmierstil zu achten!\footnote{Literatur zum Programmierstil: z.B. Robert C. Martin: \textit{Clean - Code: A Handbook of Agile Software Craftmanship}, Prentice Hall} +\codeterm[Funktion!lokale]{lokalen} oder +\codeterm[Funktion!geschachtelte|see{lokale}]{geschachtelten + Funktionen} die \"Ubersichtlichkeit erh\"oht werden. + +\noindent Es lohnt sich auf den eigenen Programmierstil zu +achten!\footnote{Literatur zum Programmierstil: z.B. Robert C. Martin: + \textit{Clean Code: A Handbook of Agile Software Craftmanship}, + Prentice Hall} diff --git a/regression/lecture/regression.tex b/regression/lecture/regression.tex index fdb6906..2ff5a02 100644 --- a/regression/lecture/regression.tex +++ b/regression/lecture/regression.tex @@ -68,9 +68,9 @@ Summe k\"onnen wir genauso gut fordern, dass der \emph{mittlere} Abstand der Menge der $N$ Datenpaare $(x_i, y_i)$ gegeben die Modellvorhersagen $y_i^{est}$ klein sein soll. -Am h\"aufigsten wird jedoch bei einem Kurvenfit der \determ{mittlere - quadratische Abstand} (\enterm{mean squared distance} oder -\enterm{mean squared error}) +Am h\"aufigsten wird jedoch bei einem Kurvenfit der \determ[mittlerer +quadratische Abstand]{mittlere quadratische Abstand} (\enterm{mean + squared distance} oder \enterm{mean squared error}) \begin{equation} \label{meansquarederror} f_{mse}(\{(x_i, y_i)\}|\{y^{est}_i\}) = \frac{1}{N} \sum_{i=1}^N (y_i - y^{est}_i)^2 @@ -130,7 +130,8 @@ f\"ur die Zielfunktion den mittleren quadratischen Abstand der Datenpaare $(x_i, y_i)$ gegeben die Parameterwerte $m$ und $b$ der Geradengleichung. Ziel des Kurvenfits ist es, die Werte f\"ur $m$ und $b$ so zu optimieren, dass -der Fehler \eqnref{mseline} minimal wird. +der Fehler \eqnref{mseline} minimal wird (\determ{Methode der + kleinsten Quadrate}, \enterm{least square error}). \begin{exercise}{lsqError.m}{} Implementiere die Zielfunktion f\"ur die Optimierung mit der @@ -160,7 +161,7 @@ $f_{cost}(m,b)$, die die beiden Variablen $m$ und $b$ auf einen Fehlerwert abbildet. Es gibt also f\"ur jeden Punkt in der sogenannten -\emph{Fehlerfl\"ache} einen Fehlerwert. In diesem Beispiel eines +\determ{Fehlerfl\"ache} einen Fehlerwert. In diesem Beispiel eines 2-dimensionalen Problems (zwei freie Parameter) kann die Fehlerfl\"ache graphisch durch einen 3-d \enterm{surface-plot} dargestellt werden. Dabei werden auf der $x$- und der $y$-Achse die @@ -278,7 +279,7 @@ Kostenfunktion verwenden. Da die Kugel immer entlang des steilsten Gef\"alles rollt, ben\"otigen wir Information \"uber die Richtung des Gef\"alles an der jeweils aktuellen Position. -Der Gradient (Box~\ref{partialderivativebox}) der Kostenfunktion +Der \determ{Gradient} (Box~\ref{partialderivativebox}) der Kostenfunktion \[ \nabla f_{cost}(m,b) = \left( \frac{\partial e(m,b)}{\partial m}, \frac{\partial f(m,b)}{\partial b} \right) \] bzgl. der beiden Parameter $m$ und $b$ der Geradengleichung ist ein Vektor, der in @@ -327,7 +328,7 @@ partielle Ableitung nach $m$ durch \section{Gradientenabstieg} -Zu guter Letzt muss nur noch der Gradientenabstieg implementiert +Zu guter Letzt muss nur noch der \determ{Gradientenabstieg} implementiert werden. Die daf\"ur ben\"otigten Zutaten haben wir aus den vorangegangenen \"Ubungen bereits vorbereitet. Wir brauchen: 1. Die Fehlerfunktion (\code{meanSquareError()}), 2. die Zielfunktion (\code{lsqError()}) diff --git a/statistics/lecture/statistics.tex b/statistics/lecture/statistics.tex index 91c9775..a8456ab 100644 --- a/statistics/lecture/statistics.tex +++ b/statistics/lecture/statistics.tex @@ -34,10 +34,10 @@ der Daten eingesetzt: nicht unbedingt identsich mit dem Modus.} \end{figure} -Der Modus ist der h\"aufigste Wert, d.h. die Position des Maximums +Der \determ{Modus} ist der h\"aufigste Wert, d.h. die Position des Maximums einer Wahrscheinlichkeitsverteilung. -Der Median teilt eine Liste von Messwerten so in zwei H\"alften, dass +Der \determ{Median} teilt eine Liste von Messwerten so in zwei H\"alften, dass die eine H\"alfte der Daten nicht gr\"o{\ss}er und die andere H\"alfte nicht kleiner als der Median ist (\figref{medianfig}). @@ -61,10 +61,11 @@ nicht kleiner als der Median ist (\figref{medianfig}). \end{exercise} Eine Wahrscheinlichkeitsverteilung kann weiter durch die Position -ihrere Quartile charakterisiert werden. Zwischen den Quartilen liegen -jeweils 25\,\% der Daten (\figref{quartilefig}). Perzentile erlauben -eine feinere Einteilung. Das 3. Quartil ist das 75. Perzentil, da -75\,\% der Daten unterhalb des 3. Quartils liegen. +ihrere \determ[Quartil]{Quartile} charakterisiert werden. Zwischen den +Quartilen liegen jeweils 25\,\% der Daten +(\figref{quartilefig}). Perzentile erlauben eine feinere +Einteilung. Das 3. Quartil ist das 75. Perzentil, da 75\,\% der Daten +unterhalb des 3. Quartils liegen. \begin{figure}[t] \includegraphics[width=1\textwidth]{quartile} @@ -90,11 +91,11 @@ eine feinere Einteilung. Das 3. Quartil ist das 75. Perzentil, da normalverteilte Zufallszahlen.} \end{figure} -Box-Whisker Plots sind eine h\"aufig verwendete Darstellung um die -Verteilung unimodaler Daten zu visualisieren und vergleichbar zu -machen mit anderen Daten. Dabei wird um den Median eine Box vom 1. zum -3. Quartil gezeichnet. Die Whiskers deuten den minimalen und den -maximalen Datenwert an (\figref{boxwhiskerfig}). +\determ{Box-Whisker Plots} sind eine h\"aufig verwendete Darstellung +um die Verteilung unimodaler Daten zu visualisieren und vergleichbar +zu machen mit anderen Daten. Dabei wird um den Median eine Box vom +1. zum 3. Quartil gezeichnet. Die Whiskers deuten den minimalen und +den maximalen Datenwert an (\figref{boxwhiskerfig}). \begin{exercise}{boxwhisker.m}{} \tr{Generate eine $40 \times 10$ matrix of random numbers and @@ -111,11 +112,12 @@ maximalen Datenwert an (\figref{boxwhiskerfig}). \section{\tr{Histogram}{Histogramm}} -Histogramme z\"ahlen die H\"aufigkeit $n_i$ des Auftretens von -$N=\sum_{i=1}^M n_i$ Messwerten in $M$ Messbereichsklassen $i$ (Bins). -Die Klassen unterteilen den Wertebereich meist in angrenzende und -gleich gro{\ss}e Intervalle. Histogramme k\"onnen verwendet werden, um die -Wahrscheinlichkeitsverteilung der Messwerte abzusch\"atzen. +\determ[Histogramm]{Histogramme} z\"ahlen die H\"aufigkeit $n_i$ des +Auftretens von $N=\sum_{i=1}^M n_i$ Messwerten in $M$ +Messbereichsklassen $i$ (Bins). Die Klassen unterteilen den +Wertebereich meist in angrenzende und gleich gro{\ss}e Intervalle. +Histogramme k\"onnen verwendet werden, um die +\determ{Wahrscheinlichkeitsverteilung} der Messwerte abzusch\"atzen. \begin{exercise}{rollthedie.m}{} \tr{Write a function that simulates rolling a die $n$ times.} @@ -171,7 +173,7 @@ Im Grenzwert zu sehr kleinen Bereichen $\Delta x$ ist die Wahrscheinlichkeit eines Wertes $x$ zwischen $x_0$ und $x_0+\Delta x$ \[ P(x_0 Date: Mon, 23 Nov 2015 15:51:19 +0100 Subject: [PATCH 04/17] Fixed operator index --- header.tex | 3 + programming/lecture/programming.tex | 110 ++++++++++++++++------------ 2 files changed, 68 insertions(+), 45 deletions(-) diff --git a/header.tex b/header.tex index 50fef0d..f184f91 100644 --- a/header.tex +++ b/header.tex @@ -196,6 +196,9 @@ \newcommand{\codeterm}[2][]{\textit{#2}\ifthenelse{\equal{#1}{}}{\protect\sindex[term]{#2}}{\protect\sindex[term]{#1}}} \newcommand{\file}[1]{\texttt{#1}} +% for escaping special characters into the index: +\newcommand{\scor}{"|} + %%%%% key-shortcuts %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \usepackage{tikz} \usetikzlibrary{shapes} diff --git a/programming/lecture/programming.tex b/programming/lecture/programming.tex index 1400ec0..ce92353 100644 --- a/programming/lecture/programming.tex +++ b/programming/lecture/programming.tex @@ -75,10 +75,14 @@ Variablen diesen Datentyp. \subsection{Arbeiten mit Variablen} Nat\"urlich kann mit den Variablen auch gearbeitet, bzw. gerechnet -werden. \matlab{} kennt alle normalen arithmetischen Operatoren wie -\code{+}, \code{-}, \code{*} und \code{/}. Die Potenz wird \"uber das -Dachsymbol \code{\^{}} dargestellt. Listing \ref{varListing3} zeigt, wie sie -benutzt werden. +werden. \matlab{} kennt alle normalen +\codeterm[Operator!arithmetischer]{arithmetischen Operatoren} wie +\code[Operator!arithmetischer!1add@+]{+}, +\code[Operator!arithmetischer!2sub@-]{-}, +\code[Operator!arithmetischer!3mul@*]{*} und +\code[Operator!arithmetischer!4div@/]{/}. Die Potenz wird \"uber das +Dachsymbol \code[Operator!arithmetischer!5pow@\^{}]{\^{}} +dargestellt. Listing \ref{varListing3} zeigt, wie sie benutzt werden. \begin{lstlisting}[label=varListing3, caption={Rechnen mit Variablen.}] >> x = 1; @@ -112,8 +116,9 @@ Beachtenswert ist z.B. in Zeilen 3 und 6, dass mit dem Inhalt einer Variablen gerechnet werden kann, ohne dass dadurch ihr Wert ver\"andert wird. Wenn der Wert einer Variablen ver\"andert werden soll, dann muss der Variable der neue Wert explizit zugewiesen werden -(mit dem \code{=} Zuweisungsoperator, z.B. Zeilen 16, 20). Zeile 25 -zeigt wie eine einzelne Variable gel\"oscht wird. +(mit dem \code[Operator!Zuweisung!=]{=} Zuweisungsoperator, +z.B. Zeilen 16, 20). Zeile 25 zeigt wie eine einzelne Variable +gel\"oscht wird. \subsection{Datentypen} @@ -244,7 +249,7 @@ erhalten werden (Listing \ref{arrayListing2}). Im Falle des Vektors Diese Ausgabe zeigt, dass Vektoren im Grunde 2-dimensional sind. Bei einem Zeilenvektor hat die erste Dimension die Gr\"o{\ss}e -1. \code[length()]{length(a)} gibt die l\"angste Ausdehnung an. Der \code{'}- +1. \code[length()]{length(a)} gibt die l\"angste Ausdehnung an. Der \code[Operator!Matrix!']{'}- Operator transponiert den Spaltenvektor zu einem Zeilenvektor (Zeilen 14 ff.). @@ -304,7 +309,7 @@ mit Indexen auf die Inhalte eines Vektors zugegriffen werden kann. \end{lstlisting} Hierbei kann auf einzelne Werte zugegriffen werden oder, analog zur -Erzeugung von Vektoren, die \code{:} Notation verwendet werden, um auf mehrere +Erzeugung von Vektoren, die \code[Operator!Matrix!:]{:} Notation verwendet werden, um auf mehrere Element gleichzeitig zuzugreifen. \begin{lstlisting}[caption={Zugriff auf den Inhalt von Vektoren I}, label=arrayListing5] @@ -365,10 +370,14 @@ problemlos m\"oglich. Bei der Multiplikation (Zeile 10), der Division (Zeile 14) und auch der Potenzierung mu{\ss} mit vorangestellem '.' klar gemacht werden, dass es sich um eine \emph{elementweise} Verarbeitung handeln soll. F\"ur diese elementweisen Operationen kennt -\matlab{} die Operatoren \code{.*}, \code{./} und \code{.\^{}}. Die -einfachen Operatoren \code{*}, \code{/} und \code{\^{}} sind mit den -entsprechenden Matrixoperationen aus der linearen Algebrar belegt -(Box \ref{matrixmultiplication}). +\matlab{} die Operatoren \code[Operator!arithmetischer!3mule@.*]{.*}, +\code[Operator!arithmetischer!4dive@./]{./} und +\code[Operator!arithmetischer!5powe@.\^{}]{.\^{}}. Die einfachen Operatoren +\code[Operator!arithmetischer!3mul@*]{*}, +\code[Operator!arithmetischer!4div@/]{/} und +\code[Operator!arithmetischer!5pow@\^{}]{\^{}} sind mit den entsprechenden +Matrixoperationen aus der linearen Algebrar belegt (Box +\ref{matrixmultiplication}). Zu Beachten ist des Weiteren noch die Fehlermeldung am Schluss von Listing \ref{arrayListing6}. Wenn zwei Vektoren (elementweise) @@ -378,7 +387,7 @@ Spaltenvektoren) \"ubereinstimmen. Will man Elemente aus einem Vektor entfernen, dann weist man den -entsprechenden Zellen einen leeren Wert (\code{[]}) zu. +entsprechenden Zellen einen leeren Wert (\code[Operator!Matrix!{[]}]{[]}) zu. \begin{lstlisting}[label=arrayListing7, caption={L\"oschen von Elementen aus einem Vektor.}] >> a = (0:2:8); @@ -443,8 +452,9 @@ bis 3-d Matrizen (Abbildung \ref{matrixfig} A,B). Erzeugt werden Matrizen sehr \"ahnlich zu den Vektoren (Listing \ref{matrixListing}). Die Definition einer Matrize wird, wie beim -Vektor, durch \code{[]} eingeschlossen. Das \code{;} trennt die -einzelnen Zeilen der Matrize. +Vektor, durch \code[Operator!Matrix!{[]}]{[]} eingeschlossen. Das +\code[Operator!Matrix!;]{;} trennt die einzelnen Zeilen der +Matrize. \begin{lstlisting}[label=matrixListing, caption={Erzeugen von Matrizen.}] >> a = [1 2 3; 4 5 6; 7 8 9] @@ -561,10 +571,12 @@ verrechnet werden, wie die Dimensionalit\"aten \"ubereinstimmen. Besondere Vorsicht sollte man immer dann walten lassen, wenn man Matrizen miteinander multiplizieren, dividieren oder potenzieren will. Hier ist es wichtig sich klarzumachen was man will: -Eine elementweise Multiplikation (\code{.*} Operator, Listing +Eine elementweise Multiplikation +(\code[Operator!arithmetischer!3mule@.*]{.*} Operator, Listing \ref{matrixOperations} Zeile 18) oder ob eine Matrixmultiplikation -(\code{*} Operator, Listing \ref{matrixOperations} Zeile 12, Box -\ref{matrixmultiplication}) durchgef\"uhrt werden soll. +(\code[Operator!arithmetischer!3mul@*]{*} Operator, Listing +\ref{matrixOperations} Zeile 12, Box \ref{matrixmultiplication}) +durchgef\"uhrt werden soll. \begin{lstlisting}[label=matrixOperations, caption={Zwei Arten von Multiplikationen auf Matrizen.}] >> A = randi(10, [3, 3]) % 2-D Matrix @@ -637,19 +649,23 @@ Boolesche Ausdr\"ucke sind Anweisungen, die zu \codeterm{wahr} oder \codeterm{falsch} ausgewertet werden. Man kennt sie z.B. aus der Mengenlehre. In der Programmierung werden sie eingesetzt, um z.B. die Beziehung zwischen Entit\"aten zu testen. Hierzu werden die -\codeterm{relationalen Operatoren} (\code{>}, \code{<}, \code{==}, -\code{!}, gr\"o{\ss}er als, kleiner als, gleich und nicht) -eingesetzt. Mehrere Ausdr\"ucke werden mittels der \codeterm{logischen - Operatoren} (\code{\&}, \code{|}, UND, ODER ) verkn\"upft. Sie sind f\"ur -uns nicht nur wichtig um Codeabschnitte bedingt auszuf\"uhren -(Verzweigungen, \ref{controlstructsec}) sondern auch um aus Vektoren -und Matrizen bequem Elemente auszuw\"ahlen (logisches Indizieren, +\codeterm{relationalen Operatoren} (\code[Operator!relationaler!>]{>}, +\code[Operator!relationaler!<]{<}, +\code[Operator!relationaler!==]{==}, +\code[Operator!relationaler!"!]{!}, gr\"o{\ss}er als, kleiner als, +gleich und nicht) eingesetzt. Mehrere Ausdr\"ucke werden mittels der +\codeterm[Operator!logischer]{logischen Operatoren} +(\code[Operator!logischer!and1@\&]{\&}, \code[Operator!logischer!or1@{"|} {}]{|}, +UND, ODER ) verkn\"upft. Sie sind f\"ur uns nicht nur wichtig um +Codeabschnitte bedingt auszuf\"uhren (Verzweigungen, +\ref{controlstructsec}) sondern auch um aus Vektoren und Matrizen +bequem Elemente auszuw\"ahlen (logisches Indizieren, \ref{logicalindexingsec}). Die Tabellen \ref{logicalandor} zeigen die -Wahrheitstabellen f\"ur das logische UND (Tabelle \ref{logicalandor}, links) -und das logische ODER (Tabelle \ref{logicalandor}, rechts). Es werden die -Aussagen A und B mit dem Operator verkn\"upft. Beim logischen UND ist -der gesamte Ausdruck nur dann wahr, wenn beide Ausdr\"ucke sich zu -wahr auswerten lassen. +Wahrheitstabellen f\"ur das logische UND (Tabelle \ref{logicalandor}, +links) und das logische ODER (Tabelle \ref{logicalandor}, rechts). Es +werden die Aussagen A und B mit dem Operator verkn\"upft. Beim +logischen UND ist der gesamte Ausdruck nur dann wahr, wenn beide +Ausdr\"ucke sich zu wahr auswerten lassen. \begin{table}[tp] \titlecaption{Wahrheitstabellen logisches UND (links) und logisches ODER (rechts).}{}\label{logicalandor} @@ -675,14 +691,16 @@ Anders ist das beim logischen ODER. Hier ist der gesamte Ausdruck wahr, wenn sich der eine \emph{oder} der andere Ausdruck zu wahr auswerten l\"a{\ss}t. Tabelle \ref{logicaloperators} zeigt die logischen Operatoren, die in \matlab{} definiert sind. Zu bemerken -sind hier noch die \code{\&\&} und \code{||} Operatoren. Man kann -beliebige Ausdr\"ucke verkn\"upfen und h\"aufig kann schon anhand des -ersten Ausdrucks entschieden werden, ob der gesamte Boolesche Ausdruck -zu wahr oder falsch ausgewertet werden wird. Wenn zwei Aussagen mit -einem UND verkn\"upft werden und der erste zu falsch ausgewertet wird, -muss der zweite gar nicht mehr gepr\"uft werden. Die Verwendung der -``short-circuit'' Versionen spart Rechenzeit. Das auschlie{\ss}ende ODER -(XOR) ist in \matlab{} nur als Funktion \code[xor()]{xor(A, B)} verf\"ugbar. +sind hier noch die \code[Operator!logischer!and2@\&\&]{\&\&} und +\code[Operator!logischer!or2@{"|}{"|} {}]{||} Operatoren. Man kann beliebige +Ausdr\"ucke verkn\"upfen und h\"aufig kann schon anhand des ersten +Ausdrucks entschieden werden, ob der gesamte Boolesche Ausdruck zu +wahr oder falsch ausgewertet werden wird. Wenn zwei Aussagen mit einem +UND verkn\"upft werden und der erste zu falsch ausgewertet wird, muss +der zweite gar nicht mehr gepr\"uft werden. Die Verwendung der +\enterm{short-circuit} Versionen spart Rechenzeit. Das auschlie{\ss}ende +ODER (XOR) ist in \matlab{} nur als Funktion \code[xor()]{xor(A, B)} +verf\"ugbar. \begin{table}[th] \titlecaption{\label{logicaloperators} @@ -701,10 +719,11 @@ muss der zweite gar nicht mehr gepr\"uft werden. Die Verwendung der \end{center} \end{table} -Um Werte miteinander zu vergleichen gibt es die \codeterm{relationalen - Operatoren} (Tabelle \ref{relationaloperators}). Mit ihnen kann man -auf Dinge wie Gleichheit (\code{==}) gr\"o{\ss}er oder kleiner als -(\code{>}, \code{<}) testen. +Um Werte miteinander zu vergleichen gibt es die +\codeterm[Operator!relationaler]{relationalen Operatoren} (Tabelle +\ref{relationaloperators}). Mit ihnen kann man auf Dinge wie +Gleichheit (\varcode{==}) gr\"o{\ss}er oder kleiner als (\varcode{>}, +\varcode{<}) testen. \begin{table}[th] \titlecaption{\label{relationaloperators} @@ -734,9 +753,10 @@ Beispiele. \matlab{} kennt die Schl\"usselworte \code{true} und \code{logical} Werte 1 und 0. \begin{important}[Zuweisungs- und Gleichheitsoperator] - Der Zuweisungsoperator \code{=} und der logische Operator \code{==} - sind zwei grundverschiedene Dinge. Da sie umgangsprachlich gleich - sind k\"onnen sie leider leicht verwechselt werden. + Der Zuweisungsoperator \code[Operator!Zuweisung!=]{=} und der + logische Operator \code[Operator!logischer!==]{==} sind zwei + grundverschiedene Dinge. Da sie umgangsprachlich gleich sind + k\"onnen sie leider leicht verwechselt werden. \end{important} \begin{lstlisting}[caption={Boolesche Ausdr\"ucke.}, label=booleanexpressions] From a5d627f2a09d3e06df29d64bf179bf44850c334d Mon Sep 17 00:00:00 2001 From: Jan Grewe Date: Mon, 23 Nov 2015 17:02:33 +0100 Subject: [PATCH 05/17] remove plt.show() from python files --- bootstrap/lecture/bootstrap-chapter.tex | 4 ++-- likelihood/lecture/likelihood-chapter.tex | 4 ++-- plotting/lecture/plotting-chapter.tex | 4 ++-- pointprocesses/lecture/isihexamples.py | 2 +- pointprocesses/lecture/pointprocessscetchA.eps | 6 +++--- pointprocesses/lecture/pointprocessscetchB.eps | 6 +++--- pointprocesses/lecture/rasterexamples.py | 2 +- programming/lecture/programming-chapter.tex | 4 ++-- regression/lecture/regression-chapter.tex | 4 ++-- statistics/lecture/statistics-chapter.tex | 4 ++-- 10 files changed, 20 insertions(+), 20 deletions(-) diff --git a/bootstrap/lecture/bootstrap-chapter.tex b/bootstrap/lecture/bootstrap-chapter.tex index 7ecd9a5..0f306cd 100644 --- a/bootstrap/lecture/bootstrap-chapter.tex +++ b/bootstrap/lecture/bootstrap-chapter.tex @@ -5,8 +5,8 @@ \lstset{inputpath=../code} \graphicspath{{figures/}} -\setcounter{page}{81} -\setcounter{chapter}{4} +\setcounter{page}{} +\setcounter{chapter}{-1} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% diff --git a/likelihood/lecture/likelihood-chapter.tex b/likelihood/lecture/likelihood-chapter.tex index 0f74fe3..00d7138 100644 --- a/likelihood/lecture/likelihood-chapter.tex +++ b/likelihood/lecture/likelihood-chapter.tex @@ -5,8 +5,8 @@ \lstset{inputpath=../code} \graphicspath{{figures/}} -\setcounter{page}{101} -\setcounter{chapter}{6} +\setcounter{page}{} +\setcounter{chapter}{-1} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% diff --git a/plotting/lecture/plotting-chapter.tex b/plotting/lecture/plotting-chapter.tex index faab54e..80bde57 100644 --- a/plotting/lecture/plotting-chapter.tex +++ b/plotting/lecture/plotting-chapter.tex @@ -5,8 +5,8 @@ \lstset{inputpath=../code} \graphicspath{{images/}} -\setcounter{page}{45} -\setcounter{chapter}{1} +\setcounter{page}{} +\setcounter{chapter}{-1} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% diff --git a/pointprocesses/lecture/isihexamples.py b/pointprocesses/lecture/isihexamples.py index 9d50fbc..b03d2a9 100644 --- a/pointprocesses/lecture/isihexamples.py +++ b/pointprocesses/lecture/isihexamples.py @@ -98,4 +98,4 @@ plotisih(ax, isis(inhspikes)) plt.tight_layout() plt.savefig('isihexamples.pdf') -plt.show() +plt.close() diff --git a/pointprocesses/lecture/pointprocessscetchA.eps b/pointprocesses/lecture/pointprocessscetchA.eps index f0a0b2d..de57b17 100644 --- a/pointprocesses/lecture/pointprocessscetchA.eps +++ b/pointprocesses/lecture/pointprocessscetchA.eps @@ -1,7 +1,7 @@ %!PS-Adobe-2.0 EPSF-2.0 %%Title: pointprocessscetchA.tex %%Creator: gnuplot 4.6 patchlevel 4 -%%CreationDate: Sun Nov 22 12:40:02 2015 +%%CreationDate: Mon Nov 23 13:45:26 2015 %%DocumentFonts: %%BoundingBox: 50 50 373 135 %%EndComments @@ -430,10 +430,10 @@ SDict begin [ /Title (pointprocessscetchA.tex) /Subject (gnuplot plot) /Creator (gnuplot 4.6 patchlevel 4) - /Author (jan) + /Author (grewe) % /Producer (gnuplot) % /Keywords () - /CreationDate (Sun Nov 22 12:40:02 2015) + /CreationDate (Mon Nov 23 13:45:26 2015) /DOCINFO pdfmark end } ifelse diff --git a/pointprocesses/lecture/pointprocessscetchB.eps b/pointprocesses/lecture/pointprocessscetchB.eps index 9576b74..ab1db53 100644 --- a/pointprocesses/lecture/pointprocessscetchB.eps +++ b/pointprocesses/lecture/pointprocessscetchB.eps @@ -1,7 +1,7 @@ %!PS-Adobe-2.0 EPSF-2.0 %%Title: pointprocessscetchB.tex %%Creator: gnuplot 4.6 patchlevel 4 -%%CreationDate: Sun Nov 22 12:40:02 2015 +%%CreationDate: Mon Nov 23 13:46:59 2015 %%DocumentFonts: %%BoundingBox: 50 50 373 237 %%EndComments @@ -430,10 +430,10 @@ SDict begin [ /Title (pointprocessscetchB.tex) /Subject (gnuplot plot) /Creator (gnuplot 4.6 patchlevel 4) - /Author (jan) + /Author (grewe) % /Producer (gnuplot) % /Keywords () - /CreationDate (Sun Nov 22 12:40:02 2015) + /CreationDate (Mon Nov 23 13:46:59 2015) /DOCINFO pdfmark end } ifelse diff --git a/pointprocesses/lecture/rasterexamples.py b/pointprocesses/lecture/rasterexamples.py index c7c2433..9c66897 100644 --- a/pointprocesses/lecture/rasterexamples.py +++ b/pointprocesses/lecture/rasterexamples.py @@ -83,4 +83,4 @@ ax.eventplot(inhspikes, colors=[[0, 0, 0]], linelength=0.8) plt.tight_layout() plt.savefig('rasterexamples.pdf') -plt.show() +plt.close() diff --git a/programming/lecture/programming-chapter.tex b/programming/lecture/programming-chapter.tex index 8eb19a1..1e78eb5 100644 --- a/programming/lecture/programming-chapter.tex +++ b/programming/lecture/programming-chapter.tex @@ -5,8 +5,8 @@ \lstset{inputpath=../code} \graphicspath{{images/}} -\setcounter{page}{15} -\setcounter{chapter}{0} +\setcounter{page}{} +\setcounter{chapter}{-1} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% diff --git a/regression/lecture/regression-chapter.tex b/regression/lecture/regression-chapter.tex index 0df5e2b..11f9132 100644 --- a/regression/lecture/regression-chapter.tex +++ b/regression/lecture/regression-chapter.tex @@ -5,8 +5,8 @@ \lstset{inputpath=../code} \graphicspath{{figures/}} -\setcounter{page}{89} -\setcounter{chapter}{5} +\setcounter{page}{} +\setcounter{chapter}{-1} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% diff --git a/statistics/lecture/statistics-chapter.tex b/statistics/lecture/statistics-chapter.tex index ad93f38..53faeda 100644 --- a/statistics/lecture/statistics-chapter.tex +++ b/statistics/lecture/statistics-chapter.tex @@ -5,8 +5,8 @@ \lstset{inputpath=../code} \graphicspath{{figures/}} -\setcounter{page}{69} -\setcounter{chapter}{3} +\setcounter{page}{} +\setcounter{chapter}{-1} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% From fd68462f986972fb55e5068e50ec2e58bff8ae0e Mon Sep 17 00:00:00 2001 From: Jan Grewe Date: Mon, 23 Nov 2015 17:35:08 +0100 Subject: [PATCH 06/17] increased font size --- plotting/lecture/plotting-chapter.tex | 4 ++-- pointprocesses/lecture/sta.py | 16 ++++++++-------- programming/lecture/programming-chapter.tex | 4 ++-- statistics/lecture/statistics-chapter.tex | 4 ++-- 4 files changed, 14 insertions(+), 14 deletions(-) diff --git a/plotting/lecture/plotting-chapter.tex b/plotting/lecture/plotting-chapter.tex index 80bde57..faab54e 100644 --- a/plotting/lecture/plotting-chapter.tex +++ b/plotting/lecture/plotting-chapter.tex @@ -5,8 +5,8 @@ \lstset{inputpath=../code} \graphicspath{{images/}} -\setcounter{page}{} -\setcounter{chapter}{-1} +\setcounter{page}{45} +\setcounter{chapter}{1} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% diff --git a/pointprocesses/lecture/sta.py b/pointprocesses/lecture/sta.py index f41c06d..0e3c350 100644 --- a/pointprocesses/lecture/sta.py +++ b/pointprocesses/lecture/sta.py @@ -43,12 +43,12 @@ def plot_results(sta_time, st_average, stim_time, s_est, stimulus, duration, dt) fig = plt.gcf() fig.set_size_inches(15, 5) - fig.subplots_adjust(left=0.075, bottom=0.12, top=0.92, right=0.975) + fig.subplots_adjust(left=0.08, bottom=0.15, top=0.9, right=0.975) fig.set_facecolor("white") sta_ax.plot(sta_time * 1000, st_average, color="dodgerblue", lw=2.) - sta_ax.set_xlabel("time [ms]", fontsize=12) - sta_ax.set_ylabel("stimulus", fontsize=12) + sta_ax.set_xlabel("time [ms]", fontsize=20) + sta_ax.set_ylabel("stimulus", fontsize=20) sta_ax.set_xlim([-50, 50]) # sta_ax.xaxis.grid('off') sta_ax.spines["right"].set_visible(False) @@ -57,7 +57,7 @@ def plot_results(sta_time, st_average, stim_time, s_est, stimulus, duration, dt) sta_ax.xaxis.set_ticks_position('bottom') sta_ax.spines["bottom"].set_linewidth(2.0) sta_ax.spines["left"].set_linewidth(2.0) - sta_ax.tick_params(direction="out", width=2.0) + sta_ax.tick_params(direction="out", width=2.0, labelsize=18) ylim = sta_ax.get_ylim() xlim = sta_ax.get_xlim() @@ -65,11 +65,11 @@ def plot_results(sta_time, st_average, stim_time, s_est, stimulus, duration, dt) sta_ax.plot([0., 0.], list(ylim), zorder=1, color='darkgray', ls='--', lw=0.75) sta_ax.set_xlim(list(xlim)) sta_ax.set_ylim(list(ylim)) - sta_ax.text(-0.225, 1.05, "A", transform=sta_ax.transAxes, size=14) + sta_ax.text(-0.25, 1.04, "A", transform=sta_ax.transAxes, size=24) stim_ax.plot(stim_time * 1000, stimulus[:,1], label='stimulus', color='dodgerblue', lw=2.) stim_ax.plot(stim_time * 1000, s_est, label='reconstruction', color='red', lw=2) - stim_ax.set_xlabel('time[ms]', fontsize=12) + stim_ax.set_xlabel('time[ms]', fontsize=20) stim_ax.set_xlim([0.0, 250]) stim_ax.set_ylim([-1., 1.]) stim_ax.legend() @@ -80,8 +80,8 @@ def plot_results(sta_time, st_average, stim_time, s_est, stimulus, duration, dt) stim_ax.xaxis.set_ticks_position('bottom') stim_ax.spines["bottom"].set_linewidth(2.0) stim_ax.spines["left"].set_linewidth(2.0) - stim_ax.tick_params(direction="out", width=2.0) - stim_ax.text(-0.075, 1.05, "B", transform=stim_ax.transAxes, size=14) + stim_ax.tick_params(direction="out", width=2.0, labelsize=18) + stim_ax.text(-0.1, 1.04, "B", transform=stim_ax.transAxes, size=24) fig.savefig("sta.pdf") plt.close() diff --git a/programming/lecture/programming-chapter.tex b/programming/lecture/programming-chapter.tex index 1e78eb5..8eb19a1 100644 --- a/programming/lecture/programming-chapter.tex +++ b/programming/lecture/programming-chapter.tex @@ -5,8 +5,8 @@ \lstset{inputpath=../code} \graphicspath{{images/}} -\setcounter{page}{} -\setcounter{chapter}{-1} +\setcounter{page}{15} +\setcounter{chapter}{0} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% diff --git a/statistics/lecture/statistics-chapter.tex b/statistics/lecture/statistics-chapter.tex index 53faeda..ad93f38 100644 --- a/statistics/lecture/statistics-chapter.tex +++ b/statistics/lecture/statistics-chapter.tex @@ -5,8 +5,8 @@ \lstset{inputpath=../code} \graphicspath{{figures/}} -\setcounter{page}{} -\setcounter{chapter}{-1} +\setcounter{page}{69} +\setcounter{chapter}{3} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% From 3899df80363f6462d72bc3696ba8183e6248e973 Mon Sep 17 00:00:00 2001 From: Jan Benda Date: Tue, 24 Nov 2015 13:26:15 +0100 Subject: [PATCH 07/17] Fixed list of figures and listings --- bootstrap/lecture/bootstrap.tex | 2 +- .../lecture/designpattern-chapter.tex | 2 +- designpattern/lecture/designpattern.tex | 20 +-- plotting/lecture/plotting.tex | 2 +- pointprocesses/lecture/pointprocesses.tex | 19 ++- programming/lecture/programming.tex | 122 ++++++++++-------- programmingstyle/lecture/programmingstyle.tex | 30 +++-- regression/lecture/regression.tex | 2 +- statistics/lecture/statistics.tex | 4 +- 9 files changed, 111 insertions(+), 92 deletions(-) diff --git a/bootstrap/lecture/bootstrap.tex b/bootstrap/lecture/bootstrap.tex index 9f96e32..7a4fbe8 100644 --- a/bootstrap/lecture/bootstrap.tex +++ b/bootstrap/lecture/bootstrap.tex @@ -44,7 +44,7 @@ die \determ{Stichprobenverteilung} (\enterm{sampling distribution}, \includegraphics[height=0.2\textheight]{srs2}\\[2ex] \includegraphics[height=0.2\textheight]{srs3} \titlecaption{\label{bootstrapsamplingdistributionfig}Bootstrap der - Stichprobenverteilung}{(a) Von der Grundgesamtheit (population) mit + Stichprobenverteilung.}{(a) Von der Grundgesamtheit (population) mit unbekanntem Parameter (z.B. Mittelwert $\mu$) zieht man Stichproben (SRS: simple random samples). Die Statistik (hier Bestimmung von $\bar x$) kann f\"ur jede Stichprobe berechnet diff --git a/designpattern/lecture/designpattern-chapter.tex b/designpattern/lecture/designpattern-chapter.tex index 23dfe21..4a44fbf 100644 --- a/designpattern/lecture/designpattern-chapter.tex +++ b/designpattern/lecture/designpattern-chapter.tex @@ -5,7 +5,7 @@ \lstset{inputpath=../code} \graphicspath{{figures/}} -\setcounter{page}{129} +\setcounter{page}{133} \setcounter{chapter}{8} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% diff --git a/designpattern/lecture/designpattern.tex b/designpattern/lecture/designpattern.tex index ec90e3f..1965ee8 100644 --- a/designpattern/lecture/designpattern.tex +++ b/designpattern/lecture/designpattern.tex @@ -10,7 +10,7 @@ einige dieser ``Design pattern'' zusammen. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{for Schleifen \"uber Vektoren} Grundlegend ist das Iterieren \"uber den Inhalt eines Vektors mit einer \code{for}-Schleife: -\begin{lstlisting}[caption={for-Schleife mit Indexen \"uber einen Vektor}] +\begin{lstlisting}[caption={\varcode{for}-Schleife mit Indexen \"uber einen Vektor}] x = [2:3:20]; % irgendein Vektor for i=1:length(x) % Mit der for-Schleife "loopen" wir ueber den Vektor i % das ist der Index, der die Elemente des Vektors indiziert. @@ -24,7 +24,7 @@ end Wenn in der Schleife das Ergebnis in einen Vektor gespeichert werden soll, sollten wir vor der Schleife schon einen Vektor f\"ur die Ergebnisse erstellen: -\begin{lstlisting}[caption={for-Schleife zum Schreiben eines Vektors}] +\begin{lstlisting}[caption={\varcode{for}-Schleife zum Schreiben eines Vektors}] x = [1.2 2.3 2.6 3.1]; % irgendein Vektor y = zeros(length(x),1); % Platz fuer die Ergebnisse, genauso viele wie Loops der Schleife for i=1:length(x) @@ -39,7 +39,7 @@ mean(y) Die Berechnungen in der Schleife k\"onnen statt einer Zahl auch einen Vektor zur\"uckgeben. Wenn die L\"ange diese Vektors bekannt ist, dann kann vorher eine entsprechend gro{\ss}e Matrix angelegt werden: -\begin{lstlisting}[caption={for-Schleife zum Schreiben von Zeilen einer Matrix}] +\begin{lstlisting}[caption={\varcode{for}-Schleife zum Schreiben von Zeilen einer Matrix}] x = [2:3:20]; % irgendein Vektor y = zeros(length(x),10); % Platz fuer die Ergebnisse for i=1:length(x) @@ -54,7 +54,7 @@ mean(y, 1) Alternativ k\"onnen die in der Schleife erzeugten Vektoren zu einem einzigen, durchgehenden Vektor zusammengestellt werden: -\begin{lstlisting}[caption={for-Schleife zum Aneinanderh\"angen von Vektoren}] +\begin{lstlisting}[caption={\varcode{for}-Schleife zum Aneinanderh\"angen von Vektoren}] x = [2:3:20]; % irgendein Vektor y = []; % Leerer Vektor fuer die Ergebnisse for i=1:length(x) @@ -87,7 +87,7 @@ y = randn(100, 1)*sigma + mu; \end{lstlisting} Das gleiche Prinzip ist manchmal auch sinnvoll f\"ur \code{zeros()} oder \code{ones()}: -\begin{lstlisting}[caption={Skalierung von zeros und ones}] +\begin{lstlisting}[caption={Skalierung von \varcode{zeros()} und \varcode{ones()}}] x = -1:0.01:2; % Vektor mit x-Werten plot(x, exp(-x.*x)); % Plotte f\"ur die gleichen x-Werte eine Linie mit y=0.8: @@ -142,25 +142,25 @@ mit anderen Histogrammen oder mit theoretischen Wahrscheinlichkeitsverteilungen werden. Die \code{histogram()} Funktion macht das mit den entsprechenden Parametern automatisch: -\begin{lstlisting}[caption={Probability-density-function mit der histogram-Funktion}] +\begin{lstlisting}[caption={Probability-density-function mit der \varcode{histogram()}-Funktion}] x = randn(100, 1); % irgendwelche reellwertige Daten histogram(x, 'Normalization', 'pdf'); \end{lstlisting} -\begin{lstlisting}[caption={Probability mit der histogram-Funktion}] +\begin{lstlisting}[caption={Probability mit der \varcode{histogram()}-Funktion}] x = randi(6, 100, 1); % irgendwelche integer Daten histogram(x, 'Normalization', 'probability'); \end{lstlisting} -So geht es aber auch: -\begin{lstlisting}[caption={Probability-density-function mit der hist- und bar-Funktion}] +So geht es mit der \code{hist()}-Funktion: +\begin{lstlisting}[caption={Probability-density-function mit der \varcode{hist()}- und \varcode{bar()}-Funktion}] x = randn(100, 1); % irgendwelche reellwertige Daten [h, b] = hist(x); % Histogram berechnen h = h/sum(h)/(b(2)-b(1)); % normieren zu einer Wahrscheinlichkeitsdichte bar(b, h); % und plotten. \end{lstlisting} -\begin{lstlisting}[caption={Probability mit der hist- und bar-Funktion}] +\begin{lstlisting}[caption={Probability mit der \varcode{hist()}- und \varcode{bar()}-Funktion}] x = randi(6, 100, 1); % irgendwelche integer Daten [h, b] = hist(x); % Histogram berechnen h = h/sum(h); % normieren zu Wahrscheinlichkeiten diff --git a/plotting/lecture/plotting.tex b/plotting/lecture/plotting.tex index e1f4289..ac917f1 100644 --- a/plotting/lecture/plotting.tex +++ b/plotting/lecture/plotting.tex @@ -177,7 +177,7 @@ Einstellungsm\"oglichkeiten. Wie schon erw\"ahnt, k\"onnen diese \begin{minipage}[t]{0.3\columnwidth} \includegraphics[width=0.9\textwidth]{property_editor} \end{minipage} - \titlecaption{Graphisches Interface ``Plot Editor''.}{\"Uber das Menu + \titlecaption{Der \matlab{} Plot-Editor.}{\"Uber das Menu ``Tools $\rightarrow$ Edit Plot'' erreicht man den Plot Editor. Je nachdem welches Element des Plots ausgew\"ahlt wurde, ver\"andern sich die Einstellungsm\"oglichkeiten. Weitere Eigenschaften und diff --git a/pointprocesses/lecture/pointprocesses.tex b/pointprocesses/lecture/pointprocesses.tex index a40e7d6..a9b5fda 100644 --- a/pointprocesses/lecture/pointprocesses.tex +++ b/pointprocesses/lecture/pointprocesses.tex @@ -25,7 +25,9 @@ sogenannten \determ[Punktprozess]{Punktprozessen}. (homogener Poisson Prozess mit Rate $\lambda=20$\;Hz, links) und eines nicht-station\"aren Punktprozesses (perfect integrate-and-fire Neuron getrieben mit Ohrnstein-Uhlenbeck - Rauschen mit Zeitkonstante $\tau=100$\,ms, rechts).} + Rauschen mit Zeitkonstante $\tau=100$\,ms, rechts). Jeder + vertikale Strich markiert den Zeitpunkt eines Ereignisses. + Jede Zeile zeigt die Ereignisse eines trials.} \end{figure} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -302,13 +304,11 @@ Abbildung \ref{psthfig} n\"aher erl\"autert. \begin{figure}[tp] \includegraphics[width=\columnwidth]{firingrates} - \titlecaption{Verschiedene Methoden die zeitabh\"angige Feuerrate - zu bestimmen.}{\textbf{A)} Rasterplot einer einzelnen neuronalen - Antwort. Jeder vertikale Strich notiert den Zeitpunkt eines - Aktionspotentials. \textbf{B)} Feurerrate aus der instantanen - Feuerrate bestimmt. \textbf{C)} klassisches PSTH mit der Binning - Methode. \textbf{D)} Feuerrate durch Faltung mit einem Gauss Kern - bestimmt.}\label{psthfig} + \titlecaption{Bestimmung der zeitabh\"angigen + Feuerrate.}{\textbf{A)} Rasterplot eines Spiketrains. \textbf{B)} + Feurerrate aus der instantanen Feuerrate bestimmt. \textbf{C)} + klassisches PSTH mit der Binning Methode. \textbf{D)} Feuerrate + durch Faltung mit einem Gauss Kern bestimmt.}\label{psthfig} \end{figure} @@ -317,8 +317,7 @@ Abbildung \ref{psthfig} n\"aher erl\"autert. \begin{figure}[tp] \includegraphics[width=\columnwidth]{isimethod} \titlecaption{Instantane Feuerrate.}{Skizze eines Spiketrains - (oben). Jeder vertikale Strich notiert den Zeitpunkt eines - Aktionspotentials. Die Pfeile zwischen aufeinanderfolgenden + (oben). Die Pfeile zwischen aufeinanderfolgenden Aktionspotentialen mit den Zahlen in Millisekunden illustrieren die Interspikeintervalle. Der Kehrwert des Interspikeintervalle ergibt die instantane Feuerrate.}\label{instrate} diff --git a/programming/lecture/programming.tex b/programming/lecture/programming.tex index ce92353..e829143 100644 --- a/programming/lecture/programming.tex +++ b/programming/lecture/programming.tex @@ -295,24 +295,22 @@ sich um einen Zeilen- oder Spaltenvektor handelt. Die Listings \ref{arrayListing4} und \ref{arrayListing5} zeigen wie mit Indexen auf die Inhalte eines Vektors zugegriffen werden kann. -\begin{lstlisting}[label=arrayListing4, caption={Zugriff auf den Inhalt von Vektoren I}] - >> a = (11:20); - >> a(1) % das 1. Element - ans = - 11 - >> a(5) % das 5. Element - ans = - 15 - >> a(end) % das letzte Element - ans = - 20 +\begin{lstlisting}[label=arrayListing4, caption={Zugriff auf den Inhalt von Vektoren: einzelne Elemente}] + >> a = (11:20) + a = 11 12 13 14 15 16 17 18 19 20 + >> a(1) % das 1. Element + ans = 11 + >> a(5) % das 5. Element + ans = 15 + >> a(end) % das letzte Element + ans = 20 \end{lstlisting} Hierbei kann auf einzelne Werte zugegriffen werden oder, analog zur Erzeugung von Vektoren, die \code[Operator!Matrix!:]{:} Notation verwendet werden, um auf mehrere Element gleichzeitig zuzugreifen. -\begin{lstlisting}[caption={Zugriff auf den Inhalt von Vektoren I}, label=arrayListing5] +\begin{lstlisting}[caption={Zugriff auf den Inhalt von Vektoren: Bereiche}, label=arrayListing5] >> a([1 3 5]) % das 1., 3. und 5. Element ans = 11 13 15 @@ -578,7 +576,7 @@ Eine elementweise Multiplikation \ref{matrixOperations} Zeile 12, Box \ref{matrixmultiplication}) durchgef\"uhrt werden soll. -\begin{lstlisting}[label=matrixOperations, caption={Zwei Arten von Multiplikationen auf Matrizen.}] +\begin{lstlisting}[label=matrixOperations, caption={Zwei Arten der Multiplikation von Matrizen.}] >> A = randi(10, [3, 3]) % 2-D Matrix A = 3 8 2 @@ -849,10 +847,10 @@ bestimmten Zeitraums ausw\"ahlen m\"ochte (Abbildung \begin{figure}[h] \includegraphics[width= 0.9\columnwidth]{logicalIndexingTime} - \titlecaption{Beispiel f\"ur ``indirektes'' logisches Indizieren.} - {Der rot markierte Abschnitt aus den Daten wurde ``indirekt'' - anhand logischen Indizierens auf dem Zeitvektor - ausgew\"ahlt.}\label{logicalindexingfig} + \titlecaption{Beispiel f\"ur logisches Indizieren.} + {Der rot markierte Abschnitt aus den Daten wurde indirekt + mit logischem Indizieren auf dem Zeitvektor + ausgew\"ahlt (\varcode{x(t > 5 & t < 6)}).}\label{logicalindexingfig} \end{figure} \begin{exercise}{logicalIndexingTime.m}{} @@ -946,10 +944,17 @@ Anweisungen ausgef\"uhrt werden. Die Schleife wird durch das Schl\"usselwort \code{end} beendet. Listing \ref{looplisting} zeigt das Grundger\"ust einer for-Schleife. -\begin{lstlisting}[caption={Beispiel einer \varcode{for} Schleife. Die Laufvariable \varcode{x} nimmt mit jeder Iteration der Schleife einen Wert des Vektors \varcode{1:5} an.}, label=looplisting] -for x = 1:5 - % ... etwas sinnvolles mit x ... -end +\begin{lstlisting}[caption={Beispiel einer \varcode{for}-Schleife.}, label=looplisting] +>> for x = 1:5 + disp(x); + end +% die Laufvariable x nimmt mit jeder Iteration der Schleife +% einen Wert des Vektors 1:5 an: + 1 + 2 + 3 + 4 + 5 \end{lstlisting} @@ -1106,22 +1111,32 @@ werden, werden die Schl\"usselworte \code{break} und \code{continue} eingesetzt (Listing \ref{breakcontinuelisting} zeigt, wie sie eingesetzt werden k\"onnen). -\begin{lstlisting}[caption={Einsatz der \varcode{continue} und \varcode{break} Schl\"usselworte um die Ausf\"uhrung von Code-Abschnitten in Schleifen zu \"uberspringen oder abzubrechen.}, label=breakcontinuelisting] -for x = 1:10 +\begin{lstlisting}[caption={Abbrechen von Schleifen mit \varcode{break}.}, label=breaklisting] +>> x = 1; + while true + if (x > 3) + break; + end + disp(x); + x = x + 1; + end +% output: + 1 + 2 + 3 +\end{lstlisting} + +\begin{lstlisting}[caption={\"Uberspringen von Code-Abschnitten in Schleifen mit \varcode{continue}.}, label=continuelisting] +for x = 1:5 if(x > 2 & x < 5) continue; end disp(x); end - -x = 1; -while true - if(x > 5) - break; - end - disp(x); - x = x + 1 -end +% output: + 1 + 2 + 5 \end{lstlisting} \begin{exercise}{logicalIndexingBenchmark.m}{logicalIndexingBenchmark.out} @@ -1225,7 +1240,7 @@ Das Folgende Beispiel (Listing \ref{badsinewavelisting}) zeigt eine Funktion, die eine Reihe von Sinusschwingungen unterschiedlicher Frequenzen berechnet und graphisch darstellt. -\begin{lstlisting}[caption={Eine Beispielfunktion, die eine Reihe Sinusse plottet.},label=badsinewavelisting] +\begin{lstlisting}[caption={Ein schlechtes Beispiel einer Funktion, die eine Reihe Sinusse plottet.},label=badsinewavelisting] function meine_erste_funktion() % Funktionskopf t = (0:0.01:2); % hier faengt der Funktionskoerper an frequenz = 1.0; @@ -1277,7 +1292,7 @@ welche Daten sie zur\"uckliefern soll. \begin{enumerate} \item \codeterm[Funktion!Name]{Name}: der Name sollte beschreiben, was die Funktion tut. In diesem Fall berechnet sie einen Sinus. Ein - geeigneter Name w\"are also \code{calculate\_sinewave()}. + geeigneter, kurzer Name w\"are also \code{sinewave()}. \item \codeterm[Funktion!Argumente]{Argumente}: die zu brechnende Sinusschwingung sei durch ihre Frequenz und die Amplitude bestimmt. Des Weiteren soll noch festgelegt werden, wie lang der @@ -1293,10 +1308,10 @@ welche Daten sie zur\"uckliefern soll. Mit dieser Information ist es nun gut m\"oglich die Funktion zu implementieren (Listing \ref{sinefunctionlisting}). -\begin{lstlisting}[caption={Funktion, die einen Sinus berechnet.}, label=sinefunctionlisting] -function [time, sine] = calculate_sinewave(frequency, amplitude, t_max, t_step) - % The function calculates a sinewave with a given frequency and - % amplitude. +\begin{lstlisting}[caption={Funktion zur Berechnung eines Sinus.}, label=sinefunctionlisting] +function [time, sine] = sinewave(frequency, amplitude, t_max, t_step) + % Calculate a sinewave of a given frequency, amplitude, duration and temporal resolution. + % [time, sine] = sinewave(frequency, amplitude, t_max, t_step) % Arguments: frequency, the frequency of the sine % amplitude, the amplitude of the sine % t_max, the duration of the sine in seconds @@ -1305,27 +1320,30 @@ function [time, sine] = calculate_sinewave(frequency, amplitude, t_max, t_step) % sine, the calculated sinewave time = (0:t_step:t_max); sine = sin(frequency .* time .* 2 * pi) .* amplitude; +end \end{lstlisting} \paragraph{II. Plotten einer einzelnen Schwingung} -Diese Aufgabe kann auch von einer Funktion \"ubernommen werden. Diese -Funktion hat keine andere Aufgabe, als die Daten zu plotten. Ihr Name -sollte sich an dieser Aufgabe orientieren -(z.B. \code{plot\_sinewave()}). Um einen einzelnen Sinus zu plotten -werden im Wesentlichen die x-Werte und die zugeh\"origen y-Werte -ben\"otigt. Da mehrere Sinus geplottet werden sollen ist es auch -sinnvoll eine Zeichenkette f\"ur die Legende an die Funktion zu +Das Plotten der berechneten Sinuschwingung kann auch von einer +Funktion \"ubernommen werden. Diese Funktion hat keine andere Aufgabe, +als die Daten zu plotten. Ihr Name sollte sich an dieser Aufgabe +orientieren (z.B. \code{plot\_function()}). Um einen einzelnen Sinus +zu plotten werden im Wesentlichen die x-Werte und die zugeh\"origen +y-Werte ben\"otigt. Da mehrere Sinus geplottet werden sollen ist es +auch sinnvoll eine Zeichenkette f\"ur die Legende an die Funktion zu \"ubergeben. Da diese Funktion keine Berechnung durchf\"uhrt wird kein R\"uckgabewert ben\"otigt (Listing \ref{sineplotfunctionlisting}). -\begin{lstlisting}[caption={Funktion, die die Daten plottet.}, label=sineplotfunctionlisting] -function plot_sinewave(x_data, y_data, name) +\begin{lstlisting}[caption={Funktion zur graphischen Darstellung der Daten.}, label=sineplotfunctionlisting] +function plot_function(x_data, y_data, name) % Plots x-data against y-data and sets the display name. + % plot_sinewave(x_data, y_data, name) % Arguments: x_data, the x-data % y_data, the y-data % name, the displayname plot(x_data, y_data, 'displayname', name) +end \end{lstlisting} @@ -1342,19 +1360,19 @@ eine neue Abbildung und setzt das \code{hold on} da nur das Skript wei{\ss}, das mehr als ein Plot erzeugt werden soll. Das Skript ist in Listing \ref{sinesskriptlisting} dargestellt. -\begin{lstlisting}[caption={Kontrollskript, das die Berechnung und plotting koordiniert.}, label=sinesskriptlisting] +\begin{lstlisting}[caption={Kontrollskript zur Koordination von Berechnung und graphischer Darstellung.}, label=sinesskriptlisting] amplitudes = 0.25:0.25:1.25; -frequency = 2; -t_max = 10; +frequency = 2.0; +t_max = 10.0; t_step = 0.01; figure() hold on for i = 1:length(amplitudes) - [x_data, y_data] = calculate_sinewave(frequency, amplitudes(i), ... + [x_data, y_data] = sinewave(frequency, amplitudes(i), ... t_max, t_step); - plot_sinewave(x_data, y_data, sprintf('freq: %5.2f, ampl: %5.2f',... + plot_function(x_data, y_data, sprintf('freq: %5.2f, ampl: %5.2f',... frequency, amplitudes(i))) end legend('show') diff --git a/programmingstyle/lecture/programmingstyle.tex b/programmingstyle/lecture/programmingstyle.tex index e3714ac..44315f9 100644 --- a/programmingstyle/lecture/programmingstyle.tex +++ b/programmingstyle/lecture/programmingstyle.tex @@ -321,23 +321,25 @@ Code wird \codeterm{Spaghetticode} genannt. Es ist h\"ochste Zeit Das Auslagern von Funktionalit\"at in eigene Funktionen f\"uhrt dazu, dass eine F\"ulle von Dateien erzeugt wird, die die \"Ubersichtlichkeit nicht unbedingt erh\"oht. Wenn die auszulagernde -Funktionalit\"at an vielen Stellen ben\"otigt wird ist es dennoch -sinnvoll dies zu tun. Wenn nicht, dann bietet \matlab{} die -M\"oglichkeit sogenannte \codeterm[Funktion!lokale]{lokale Funktionen} -oder auch \codeterm[Funktion!geschachtelte|see{lokale}]{geschachtelte - Funktionen} (\enterm{nested functions}) zu erstellen. Listing -\ref{localfunctions} zeigt ein Beispiel f\"ur eine lokale Funktion. - -\lstinputlisting[label=localfunctions, caption={Lokale Funktionen - erh\"ohen die Lesbarkeit sind aber nur innerhalb der definierenden - Datei verf\"ugbar.}]{calculate_sines.m} +Funktionalit\"at an vielen Stellen ben\"otigt wird ist es dennoch sehr +sinnvoll dies zu tun. Wenn Funktionen nur von einzelnen anderen +Funktionen verwendet werden, dann bietet \matlab{} die M\"oglichkeit +sogenannte \codeterm[Funktion!lokale]{lokale Funktionen} oder auch +\codeterm[Funktion!geschachtelte]{geschachtelte Funktionen} +(\enterm{nested functions}) in einer einzelnen Datei zu +erstellen. Listing \ref{localfunctions} zeigt ein Beispiel f\"ur eine +lokale Funktion. + +\lstinputlisting[label=localfunctions, caption={Beispiel f\"ur den + Einsatz von lokalen Funktionen.}]{calculate_sines.m} Lokale Funktionen existieren in der gleichen Datei und sind nur dort verf\"ugbar. Jede Funktion hat ihren eigenen G\"ultigkeitsbereich, das hei{\ss}t, dass Variablen aus den aufrufenden Funktionen nicht -sichtbar sind. Bei sogenannten -\codeterm[Funktion!geschachtelte|see{lokale}]{geschachtelten - Funktionen} ist das anders. Diese werden innerhalb eines +sichtbar sind. + +Bei sogenannten \codeterm[Funktion!geschachtelte}]{geschachtelten +Funktionen} ist das anders. Diese werden innerhalb eines Funktionsk\"orpers (zwischen den Schl\"usselworten \code{function} und dem \code{end} definiert und k\"onnen auf alle Variablen der ``Mutterfunktion'' zugreifen und diese auch ver\"andern. Folglich @@ -407,7 +409,7 @@ diese sollten dann beachtet werden. Wiederholte Programmabschnitte sollten in Funktionen ausgelagert werden. Wenn diese nicht von globalem Interesse sind, kann mit \codeterm[Funktion!lokale]{lokalen} oder -\codeterm[Funktion!geschachtelte|see{lokale}]{geschachtelten +\codeterm[Funktion!geschachtelte]{geschachtelten Funktionen} die \"Ubersichtlichkeit erh\"oht werden. \noindent Es lohnt sich auf den eigenen Programmierstil zu diff --git a/regression/lecture/regression.tex b/regression/lecture/regression.tex index 2ff5a02..eaceaa0 100644 --- a/regression/lecture/regression.tex +++ b/regression/lecture/regression.tex @@ -300,7 +300,7 @@ partielle Ableitung nach $m$ durch \begin{figure}[t] \includegraphics[width=0.75\columnwidth]{error_gradient} - \titlecaption{Der Gradienten der Fehlerfl\"ache.} + \titlecaption{Gradient der Fehlerfl\"ache.} {Jeder Pfeil zeigt die Richtung und die Steigung f\"ur verschiedene Parameterkombination aus Steigung und $y$-Achsenabschnitt an. Die Kontourlinien im Hintergrund diff --git a/statistics/lecture/statistics.tex b/statistics/lecture/statistics.tex index a8456ab..f61a971 100644 --- a/statistics/lecture/statistics.tex +++ b/statistics/lecture/statistics.tex @@ -221,7 +221,7 @@ Standardabweichung $\sigma$. \begin{figure}[t] \includegraphics[width=1\textwidth]{pdfhistogram} - \titlecaption{\label{pdfhistogramfig} Histogramme mit verschiednenen + \titlecaption{\label{pdfhistogramfig} Histogramme mit verschiedenen Klassenbreiten von normalverteilten Messwerten.}{Links: Die H\"ohe des absoluten Histogramms h\"angt von der Klassenbreite ab. Rechts: Bei auf das Integral normierten Histogrammen werden @@ -287,7 +287,7 @@ nur unzureichend oder \"uberhaupt nicht erfasst (\figref{nonlincorrelationfig}). \begin{figure}[tp] \includegraphics[width=1\textwidth]{nonlincorrelation} - \titlecaption{\label{nonlincorrelationfig} Korrelationen von + \titlecaption{\label{nonlincorrelationfig} Korrelationen bei nichtlineare Zusammenh\"angen.}{Der Korrelationskoeffizienten erfasst nur lineare Zusammenh\"ange. Sowohl die quadratische Abh\"angigkeit (links) als auch eine Rauschkorrelation (rechts), From b1fdc18111a30bbe66091e75f1914c7ba08d26a0 Mon Sep 17 00:00:00 2001 From: Jan Benda Date: Tue, 24 Nov 2015 17:17:58 +0100 Subject: [PATCH 08/17] Improved STA figure --- bootstrap/lecture/bootstrap-chapter.tex | 4 +- likelihood/lecture/likelihood-chapter.tex | 4 +- pointprocesses/lecture/pointprocesses.tex | 2 - pointprocesses/lecture/sta.py | 52 ++++++++++++++--------- regression/lecture/regression-chapter.tex | 4 +- 5 files changed, 39 insertions(+), 27 deletions(-) diff --git a/bootstrap/lecture/bootstrap-chapter.tex b/bootstrap/lecture/bootstrap-chapter.tex index 0f306cd..7ecd9a5 100644 --- a/bootstrap/lecture/bootstrap-chapter.tex +++ b/bootstrap/lecture/bootstrap-chapter.tex @@ -5,8 +5,8 @@ \lstset{inputpath=../code} \graphicspath{{figures/}} -\setcounter{page}{} -\setcounter{chapter}{-1} +\setcounter{page}{81} +\setcounter{chapter}{4} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% diff --git a/likelihood/lecture/likelihood-chapter.tex b/likelihood/lecture/likelihood-chapter.tex index 00d7138..0f74fe3 100644 --- a/likelihood/lecture/likelihood-chapter.tex +++ b/likelihood/lecture/likelihood-chapter.tex @@ -5,8 +5,8 @@ \lstset{inputpath=../code} \graphicspath{{figures/}} -\setcounter{page}{} -\setcounter{chapter}{-1} +\setcounter{page}{101} +\setcounter{chapter}{6} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% diff --git a/pointprocesses/lecture/pointprocesses.tex b/pointprocesses/lecture/pointprocesses.tex index a9b5fda..3ca29cc 100644 --- a/pointprocesses/lecture/pointprocesses.tex +++ b/pointprocesses/lecture/pointprocesses.tex @@ -503,5 +503,3 @@ die Zellantwort mit dem STA verfaltet. genauso gro{\ss} ist wie der Originalstimulus aus der Datei \file{sta\_data.mat}. \end{exercise} - - diff --git a/pointprocesses/lecture/sta.py b/pointprocesses/lecture/sta.py index 0e3c350..c5d702b 100644 --- a/pointprocesses/lecture/sta.py +++ b/pointprocesses/lecture/sta.py @@ -38,18 +38,22 @@ def reconstruct_stimulus(spike_times, sta, stimulus, t_max=30., dt=1e-4): def plot_results(sta_time, st_average, stim_time, s_est, stimulus, duration, dt): + plt.xkcd() sta_ax = plt.subplot2grid((1, 3), (0, 0), rowspan=1, colspan=1) stim_ax = plt.subplot2grid((1, 3), (0, 1), rowspan=1, colspan=2) fig = plt.gcf() - fig.set_size_inches(15, 5) + fig.set_size_inches(8, 3) fig.subplots_adjust(left=0.08, bottom=0.15, top=0.9, right=0.975) fig.set_facecolor("white") - sta_ax.plot(sta_time * 1000, st_average, color="dodgerblue", lw=2.) - sta_ax.set_xlabel("time [ms]", fontsize=20) - sta_ax.set_ylabel("stimulus", fontsize=20) - sta_ax.set_xlim([-50, 50]) + sta_ax.plot(sta_time * 1000, st_average, color="#FF9900", lw=2.) + sta_ax.set_xlabel("Time (ms)") + sta_ax.set_ylabel("Stimulus") + sta_ax.set_xlim(-40, 20) + sta_ax.set_xticks(np.arange(-40, 21, 20)) + sta_ax.set_ylim(-0.1, 0.2) + sta_ax.set_yticks(np.arange(-0.1, 0.21, 0.1)) # sta_ax.xaxis.grid('off') sta_ax.spines["right"].set_visible(False) sta_ax.spines["top"].set_visible(False) @@ -57,32 +61,42 @@ def plot_results(sta_time, st_average, stim_time, s_est, stimulus, duration, dt) sta_ax.xaxis.set_ticks_position('bottom') sta_ax.spines["bottom"].set_linewidth(2.0) sta_ax.spines["left"].set_linewidth(2.0) - sta_ax.tick_params(direction="out", width=2.0, labelsize=18) - + sta_ax.tick_params(direction="out", width=2.0) ylim = sta_ax.get_ylim() xlim = sta_ax.get_xlim() - sta_ax.plot(list(xlim), [0., 0.], zorder=1, color='darkgray', ls='--', lw=0.75) - sta_ax.plot([0., 0.], list(ylim), zorder=1, color='darkgray', ls='--', lw=0.75) + sta_ax.plot(list(xlim), [0., 0.], zorder=1, color='darkgray', ls='--', lw=1) + sta_ax.plot([0., 0.], list(ylim), zorder=1, color='darkgray', ls='--', lw=1) sta_ax.set_xlim(list(xlim)) sta_ax.set_ylim(list(ylim)) - sta_ax.text(-0.25, 1.04, "A", transform=sta_ax.transAxes, size=24) + sta_ax.annotate('Time of\nspike', + xy=(0, 0.18), xycoords='data', + xytext=(-35, 0.19), textcoords='data', ha='left', + arrowprops=dict(arrowstyle="->", relpos=(1.0,0.5), + connectionstyle="angle3,angleA=0,angleB=-70") ) + sta_ax.annotate('STA', + xy=(-10, 0.05), xycoords='data', + xytext=(-33, 0.09), textcoords='data', ha='left', + arrowprops=dict(arrowstyle="->", relpos=(1.0,0.0), + connectionstyle="angle3,angleA=60,angleB=-40") ) + #sta_ax.text(-0.25, 1.04, "A", transform=sta_ax.transAxes, size=24) - stim_ax.plot(stim_time * 1000, stimulus[:,1], label='stimulus', color='dodgerblue', lw=2.) - stim_ax.plot(stim_time * 1000, s_est, label='reconstruction', color='red', lw=2) - stim_ax.set_xlabel('time[ms]', fontsize=20) - stim_ax.set_xlim([0.0, 250]) + stim_ax.plot(stim_time * 1000, stimulus[:,1], label='stimulus', color='#0000FF', lw=2.) + stim_ax.plot(stim_time * 1000, s_est, label='reconstruction', color='#FF9900', lw=2) + stim_ax.set_xlabel('Time (ms)') + stim_ax.set_xlim(0.0, 200) stim_ax.set_ylim([-1., 1.]) - stim_ax.legend() - stim_ax.plot([0.0, 250], [0., 0.], color="darkgray", lw=0.75, ls='--', zorder=1) + stim_ax.legend(loc=(0.3, 0.85), frameon=False, fontsize=12) + stim_ax.plot([0.0, 250], [0., 0.], color="darkgray", lw=1, ls='--', zorder=1) stim_ax.spines["right"].set_visible(False) stim_ax.spines["top"].set_visible(False) stim_ax.yaxis.set_ticks_position('left') stim_ax.xaxis.set_ticks_position('bottom') stim_ax.spines["bottom"].set_linewidth(2.0) stim_ax.spines["left"].set_linewidth(2.0) - stim_ax.tick_params(direction="out", width=2.0, labelsize=18) - stim_ax.text(-0.1, 1.04, "B", transform=stim_ax.transAxes, size=24) - + stim_ax.tick_params(direction="out", width=2.0) + #stim_ax.text(-0.1, 1.04, "B", transform=stim_ax.transAxes, size=24) + + fig.tight_layout() fig.savefig("sta.pdf") plt.close() diff --git a/regression/lecture/regression-chapter.tex b/regression/lecture/regression-chapter.tex index 11f9132..0df5e2b 100644 --- a/regression/lecture/regression-chapter.tex +++ b/regression/lecture/regression-chapter.tex @@ -5,8 +5,8 @@ \lstset{inputpath=../code} \graphicspath{{figures/}} -\setcounter{page}{} -\setcounter{chapter}{-1} +\setcounter{page}{89} +\setcounter{chapter}{5} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% From 112829daaf301f113f8495f2854c733c934c2751 Mon Sep 17 00:00:00 2001 From: Jan Benda Date: Tue, 24 Nov 2015 18:52:00 +0100 Subject: [PATCH 09/17] fixed latex errors --- programming/lecture/programming.tex | 2 +- programmingstyle/lecture/programmingstyle.tex | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/programming/lecture/programming.tex b/programming/lecture/programming.tex index e829143..065c078 100644 --- a/programming/lecture/programming.tex +++ b/programming/lecture/programming.tex @@ -850,7 +850,7 @@ bestimmten Zeitraums ausw\"ahlen m\"ochte (Abbildung \titlecaption{Beispiel f\"ur logisches Indizieren.} {Der rot markierte Abschnitt aus den Daten wurde indirekt mit logischem Indizieren auf dem Zeitvektor - ausgew\"ahlt (\varcode{x(t > 5 & t < 6)}).}\label{logicalindexingfig} + ausgew\"ahlt (\varcode{x(t > 5 \& t < 6)}).}\label{logicalindexingfig} \end{figure} \begin{exercise}{logicalIndexingTime.m}{} diff --git a/programmingstyle/lecture/programmingstyle.tex b/programmingstyle/lecture/programmingstyle.tex index 44315f9..9d9db0d 100644 --- a/programmingstyle/lecture/programmingstyle.tex +++ b/programmingstyle/lecture/programmingstyle.tex @@ -338,7 +338,7 @@ verf\"ugbar. Jede Funktion hat ihren eigenen G\"ultigkeitsbereich, das hei{\ss}t, dass Variablen aus den aufrufenden Funktionen nicht sichtbar sind. -Bei sogenannten \codeterm[Funktion!geschachtelte}]{geschachtelten +Bei sogenannten \codeterm[Funktion!geschachtelte]{geschachtelten Funktionen} ist das anders. Diese werden innerhalb eines Funktionsk\"orpers (zwischen den Schl\"usselworten \code{function} und dem \code{end} definiert und k\"onnen auf alle Variablen der From 3431a937725204394e300aac54d14cdb988b30e0 Mon Sep 17 00:00:00 2001 From: Jan Benda Date: Tue, 24 Nov 2015 19:19:26 +0100 Subject: [PATCH 10/17] fixed index to toc. Added frontmatter --- header.tex | 1 + scientificcomputing-script.tex | 14 +++++++++++--- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/header.tex b/header.tex index f184f91..201f295 100644 --- a/header.tex +++ b/header.tex @@ -26,6 +26,7 @@ %%%%% index %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \usepackage[makeindex]{splitidx} \makeindex +\usepackage[totoc]{idxlayout} \newindex[Fachbegriffe]{term} \newindex[Englische Fachbegriffe]{enterm} \newindex[MATLAB Code]{code} diff --git a/scientificcomputing-script.tex b/scientificcomputing-script.tex index 4a4ce18..f75b39d 100644 --- a/scientificcomputing-script.tex +++ b/scientificcomputing-script.tex @@ -12,12 +12,17 @@ \maketitle \hypersetup{pageanchor=true} +\frontmatter + \tableofcontents \listoffigures \lstlistoflistings \listofexercisefs \listofiboxfs + +\mainmatter + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \part{Grundlagen des Programmierens} @@ -68,11 +73,14 @@ %\chapter{Cheat-Sheet} -\addcontentsline{toc}{chapter}{Fachbegriffe} +\backmatter + +%%%% indices: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \printindex[term] -\addcontentsline{toc}{chapter}{Englische Fachbegriffe} + \printindex[enterm] -\addcontentsline{toc}{chapter}{MATLAB Code} + +%\setindexprenote{Some explanations.} \printindex[code] \end{document} From 5b2aaad235f889d25e89dd24f4613e5466855bdd Mon Sep 17 00:00:00 2001 From: Jan Benda Date: Tue, 24 Nov 2015 23:08:43 +0100 Subject: [PATCH 11/17] Fixed table rows. --- header.tex | 5 + plotting/lecture/plotting-chapter.tex | 2 +- plotting/lecture/plotting.tex | 100 ++++++++---------- .../lecture/pointprocesses-chapter.tex | 2 +- programming/lecture/programming-chapter.tex | 2 +- programming/lecture/programming.tex | 51 +++++---- .../lecture/programmingstyle-chapter.tex | 2 +- statistics/lecture/statistics-chapter.tex | 2 +- 8 files changed, 79 insertions(+), 87 deletions(-) diff --git a/header.tex b/header.tex index 201f295..aede0ad 100644 --- a/header.tex +++ b/header.tex @@ -140,6 +140,11 @@ \newcommand{\tabrefb}[1]{\tabb~\tref{#1}} \newcommand{\tabsrefb}[1]{\tabsb~\tref{#1}} +% invisible rule for expanding the height of a row in a table header: +\newcommand{\erh}{\rule[-1.2ex]{0pt}{3.5ex}} +% invisible rule for expanding the height of a row in a table body: +\newcommand{\erb}{\rule{0pt}{2.5ex}} + %%%%% equation references %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %\newcommand{\eqref}[1]{(\ref{#1})} \newcommand{\eqn}{\tr{Eq}{Gl}.} diff --git a/plotting/lecture/plotting-chapter.tex b/plotting/lecture/plotting-chapter.tex index faab54e..9dab40d 100644 --- a/plotting/lecture/plotting-chapter.tex +++ b/plotting/lecture/plotting-chapter.tex @@ -5,7 +5,7 @@ \lstset{inputpath=../code} \graphicspath{{images/}} -\setcounter{page}{45} +\setcounter{page}{33} \setcounter{chapter}{1} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% diff --git a/plotting/lecture/plotting.tex b/plotting/lecture/plotting.tex index ac917f1..86164b3 100644 --- a/plotting/lecture/plotting.tex +++ b/plotting/lecture/plotting.tex @@ -241,51 +241,41 @@ Farben ist vordefiniert kann aber durch das Setzen einer die Farbe und die verschiedenen Marker. \begin{table}[tp] - \titlecaption{Vordefinierte Linienstile (links), Farben (Mitte) und Markersymbole (rechts).}{}\label{plotlinestyles} - \begin{minipage}[t]{0.3\textwidth} - \vspace{0pt} - \begin{tabular}{lc} \hline - \textbf{Linienstil} & \textbf{K\"urzel} \\\hline - durchgezogen & '\verb|-|' \\ - gestrichelt & '\verb|--|' \\ - gepunktet & '\verb|:|' \\ - Strichpunkte & '\verb|.-|' \\\hline - \end{tabular} - \end{minipage} - \vspace{0pt} - \begin{minipage}[t]{.3\textwidth} - \vspace{0pt} - \hspace{0.05\textwidth} - \begin{tabular}{lc} \hline - \textbf{Farbe} & \textbf{K\"urzel} \\ \hline - Rot & 'r'\\ - Gr\"un & 'g' \\ - Blau & 'b' \\ - Cyan & 'c' \\ - Magenta & 'm' \\ - Gelb & 'y' \\ - Schwarz & 'k' \\ \hline - \end{tabular} - \end{minipage} - \vspace{0pt} - \begin{minipage}[t]{0.3\textwidth} - \vspace{0pt} - \begin{tabular}{lc} \hline - \textbf{Markersymbol} & \textbf{K\"urzel} \\ \hline - Kreis & 'o'\\ - Stern & '*' \\ - Plus & '+' \\ - Kreuz & 'x' \\ - Diamant & 'd' \\ - Pentagramm & 'p' \\ - Hexagramm & 'h' \\ - Quadrat & 's' \\ - Dreieck & '\^{}' \\ - Umgekehrtes Dreieck & 'v' \\ - Dreieck links & '$<$'\\ - Dreieck rechts & '$>$'\\\hline - \end{tabular} - \end{minipage} + \titlecaption{Vordefinierte Linienstile (links), Farben (Mitte) und Markersymbole (rechts).}{}\label{plotlinestyles} + \begin{tabular}[t]{lc} \hline + \textbf{Linienstil} & \textbf{K\"urzel} \erh \\\hline + durchgezogen & '\verb|-|' \erb \\ + gestrichelt & '\verb|--|' \\ + gepunktet & '\verb|:|' \\ + Strichpunkte & '\verb|.-|' \\\hline + \end{tabular} + \hfill + \begin{tabular}[t]{lc} \hline + \textbf{Farbe} & \textbf{K\"urzel} \erh \\ \hline + Rot & 'r' \erb \\ + Gr\"un & 'g' \\ + Blau & 'b' \\ + Cyan & 'c' \\ + Magenta & 'm' \\ + Gelb & 'y' \\ + Schwarz & 'k' \\ \hline + \end{tabular} + \hfill + \begin{tabular}[t]{lc} \hline + \textbf{Markersymbol} & \textbf{K\"urzel} \erh \\ \hline + Kreis & 'o' \erb \\ + Stern & '*' \\ + Plus & '+' \\ + Kreuz & 'x' \\ + Diamant & 'd' \\ + Pentagramm & 'p' \\ + Hexagramm & 'h' \\ + Quadrat & 's' \\ + Dreieck & '\^{}' \\ + Umgekehrtes Dreieck & 'v' \\ + Dreieck links & '$<$'\\ + Dreieck rechts & '$>$'\\\hline + \end{tabular} \end{table} \subsection{Ver\"andern von Linieneigenschaften} @@ -332,10 +322,10 @@ der gerade aktiven Achse. \begin{table}[tp] \titlecaption{Ausgew\"ahlte Eigenschaften der Achse.}{ Alle Eigenschaften der Achse findet man in der Hilfe oder im \codeterm{Property Editor} (\figref{ploteditorfig}). Wenn es eine definierte Auswahl von Einstellungen gibt, z.B. bei der Eigenschaft \code{Box}, dann ist die Standardeinstellungen als erstes gelistet.}\label{plotaxisprops} - \begin{tabular*}{1\textwidth}{lp{6.3cm}p{6cm}} \hline - \textbf{Eigenschaft} & \textbf{Beschreibung} & \textbf{Optionen} \\ \hline - \code{Box} & Definiert, ob der Rahmen der Achse vollst\"andig gezeichnet wird. & $\{'on'|'off'\}$ \\ - \code{Color} & Hintergrundfarbe des Koordinatensystems. & Beliebige RGB, CMYK ... Werte. \\ + \begin{tabular*}{1\textwidth}{lp{5.8cm}p{5.5cm}} \hline + \textbf{Eigenschaft} & \textbf{Beschreibung} & \textbf{Optionen} \erh \\ \hline + \code{Box} & Definiert, ob der Rahmen der Achse vollst\"andig gezeichnet wird. & $\{'on'|'off'\}$ \erb \\ + \code{Color} & Hintergrundfarbe des Koordinatensystems. & Beliebige RGB, CMYK Werte. \\ \code{Fontname} & Der Name der Schriftart. & Im System installierte Schriften. \\ \code{FontSize} & Gr\"o{\ss}e der Schrift. & Skalarer Wert.\\ \code{FontUnit} & Einheit, in der die Schriftgr\"o{\ss}e bestimmt wird. & $\{'points' | 'centimeters' | 'inches', ...\}$\\ @@ -355,10 +345,10 @@ der gerade aktiven Achse. \subsection{Ver\"andern von Figure-Einstellungen} \begin{table}[tp] - \titlecaption{Ausgew\"ahlte Eigenschaften der \enterm[figure]{Figure}.}{Alle Eigenschaften der Figure findet man in der Hilfe von \matlab{} oder im \codeterm{Property Editor} wenn die Abbildung ausgew\"ahlt wurde (\figref{ploteditorfig}).}\label{plotfigureprops} - \begin{tabular*}{1\textwidth}{lp{6.3cm}p{6cm}} \hline - \textbf{Eigenschaft} & \textbf{Beschreibung} & \textbf{Optionen} \\ \hline - \code{Color} & Hintergrundfarbe der Zeichenfl\"ache. & Beliebige RGB, CMYK ... Werte. \\ + \titlecaption{Ausgew\"ahlte Eigenschaften der Figure.}{Alle Eigenschaften der \enterm[figure]{Figure} findet man in der Hilfe von \matlab{} oder im \codeterm{Property Editor} wenn die Abbildung ausgew\"ahlt wurde (\figref{ploteditorfig}).}\label{plotfigureprops} + \begin{tabular*}{1\textwidth}{lp{6.6cm}p{5.7cm}} \hline + \textbf{Eigenschaft} & \textbf{Beschreibung} & \textbf{Optionen} \erh \\ \hline + \code{Color} & Hintergrundfarbe der Zeichenfl\"ache. & Beliebige RGB, CMYK Werte. \erb \\ \code{PaperPosition} & Position der Abbildung auf dem Papier & 4-elementiger Vektor mit den Positionen der linken-unteren, und rechten-oberen Ecke. \\ \code{PaperSize} & Gr\"o{\ss}e der des Papiers. & 2-elementiger Vektor mit der Papiergr\"o{\ss}e.\\ \code{PaperUnits} & Einheit, in der die Papiergr\"o{\ss}e bestimmt wird. & $\{'inches' | 'centimeters' | 'normalized' | 'points'\}$\\ @@ -427,8 +417,8 @@ Homepage viele Beispiele mit zugeh\"origem Code Von \matlab{} unterst\"utzte Formate\footnote{Auswahl, mehr Information in der Hilfe zu \code{saveas()}}:\\[2ex] \begin{tabular}{|l|c|l|} \hline - \textbf{Format} & \textbf{Typ} & \code{saveas()} Argument \rule[-1.2ex]{0pt}{3.5ex} \\ \hline - pdf & Vektor & \varcode{'pdf'} \rule{0pt}{2.5ex} \\ + \textbf{Format} & \textbf{Typ} & \code{saveas()} Argument \erh \\ \hline + pdf & Vektor & \varcode{'pdf'} \erb \\ eps & Vektor & \varcode{'eps'}, \varcode{'epsc'} \\ SVG & Vektor & \varcode{'svg'} \\ PS & Vektor & \varcode{'ps'}, \varcode{'psc'} \\ diff --git a/pointprocesses/lecture/pointprocesses-chapter.tex b/pointprocesses/lecture/pointprocesses-chapter.tex index 70de527..3dfc545 100644 --- a/pointprocesses/lecture/pointprocesses-chapter.tex +++ b/pointprocesses/lecture/pointprocesses-chapter.tex @@ -5,7 +5,7 @@ \lstset{inputpath=../code} \graphicspath{{figures/}} -\setcounter{page}{111} +\setcounter{page}{99} \setcounter{chapter}{7} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% diff --git a/programming/lecture/programming-chapter.tex b/programming/lecture/programming-chapter.tex index 8eb19a1..3c02596 100644 --- a/programming/lecture/programming-chapter.tex +++ b/programming/lecture/programming-chapter.tex @@ -5,7 +5,7 @@ \lstset{inputpath=../code} \graphicspath{{images/}} -\setcounter{page}{15} +\setcounter{page}{3} \setcounter{chapter}{0} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% diff --git a/programming/lecture/programming.tex b/programming/lecture/programming.tex index 065c078..b94ab30 100644 --- a/programming/lecture/programming.tex +++ b/programming/lecture/programming.tex @@ -142,8 +142,8 @@ unterschiedlichem Speicherbedarf und Wertebreich. \titlecaption{Grundlegende numerische Datentypen und ihr Wertebereich.}{} \label{dtypestab} \begin{tabular}{llcl}\hline - Datentyp & Speicherbedarf & Wertebereich & Beispiel \rule{0pt}{2.5ex} \\ \hline - double & 64 bit & $\approx -10^{308}$ bis $\approx 10^{308} $& Flie{\ss}kommazahlen.\rule{0pt}{2.5ex}\\ + Datentyp & Speicherbedarf & Wertebereich & Beispiel \erh \\ \hline + double & 64 bit & $\approx -10^{308}$ bis $\approx 10^{308} $& Flie{\ss}kommazahlen.\erb\\ int & 64 bit & $-2^{31}$ bis $2^{31}-1$ & Ganzzahlige Werte \\ int16 & 16 bit & $-2^{15}$ bis $2^{15}-1$ & Digitalisierte Spannungen. \\ uint8 & 8 bit & $0$ bis $255$ & Digitalisierte Imaging Daten. \\ \hline @@ -667,22 +667,19 @@ Ausdr\"ucke sich zu wahr auswerten lassen. \begin{table}[tp] \titlecaption{Wahrheitstabellen logisches UND (links) und logisches ODER (rechts).}{}\label{logicalandor} - \begin{minipage}[t]{0.4\textwidth} - \begin{tabular}{llll} - \multicolumn{2}{l}{\multirow{2}{*}{}} & \multicolumn{2}{c}{\textbf{B}} \\ - \multicolumn{2}{l}{} & \multicolumn{1}{|c|}{wahr} & falsch \\ \cline{2-4} - \multirow{2}{*}{\textbf{A}} & \multicolumn{1}{l|}{wahr} & \multicolumn{1}{c|}{\textcolor{mygreen}{wahr}} & \textcolor{red}{falsch} \\ \cline{2-4} - & \multicolumn{1}{l|}{falsch} & \multicolumn{1}{l|}{\textcolor{red}{falsch}} & \textcolor{red}{falsch} - \end{tabular} - \end{minipage} - \begin{minipage}[t]{0.4\textwidth} - \begin{tabular}{llll} - \multicolumn{2}{l}{\multirow{2}{*}{}} & \multicolumn{2}{c}{\textbf{B}} \\ - \multicolumn{2}{l}{} & \multicolumn{1}{|c|}{wahr} & falsch \\ \cline{2-4} - \multirow{2}{*}{\textbf{A}} & \multicolumn{1}{l|}{wahr} & \multicolumn{1}{c|}{\textcolor{mygreen}{wahr}} & \textcolor{mygreen}{wahr} \\ \cline{2-4} - & \multicolumn{1}{l|}{falsch} & \multicolumn{1}{l|}{\textcolor{mygreen}{wahr}} & \textcolor{red}{falsch} - \end{tabular} - \end{minipage} + \begin{tabular}{llll} + \multicolumn{2}{l}{\multirow{2}{*}{}} & \multicolumn{2}{c}{\textbf{B}} \\ + \multicolumn{2}{l}{} & \multicolumn{1}{|c}{wahr} & falsch \\ \cline{2-4} + \multirow{2}{*}{\textbf{A}} & \multicolumn{1}{l|}{wahr} & \multicolumn{1}{c}{\textcolor{mygreen}{wahr}} & \textcolor{red}{falsch} \erb \\ + & \multicolumn{1}{l|}{falsch} & \multicolumn{1}{l}{\textcolor{red}{falsch}} & \textcolor{red}{falsch} + \end{tabular} + \hspace{0.1\textwidth} + \begin{tabular}{llll} + \multicolumn{2}{l}{\multirow{2}{*}{}} & \multicolumn{2}{c}{\textbf{B}} \\ + \multicolumn{2}{l}{} & \multicolumn{1}{|c}{wahr} & falsch \\ \cline{2-4} + \multirow{2}{*}{\textbf{A}} & \multicolumn{1}{l|}{wahr} & \multicolumn{1}{c}{\textcolor{mygreen}{wahr}} & \textcolor{mygreen}{wahr} \erb \\ + & \multicolumn{1}{l|}{falsch} & \multicolumn{1}{l}{\textcolor{mygreen}{wahr}} & \textcolor{red}{falsch} + \end{tabular} \end{table} Anders ist das beim logischen ODER. Hier ist der gesamte Ausdruck @@ -704,10 +701,10 @@ verf\"ugbar. \titlecaption{\label{logicaloperators} Logische Operatoren in \matlab.}{} \begin{center} - \begin{tabular}{c|c} + \begin{tabular}{cc} \hline - \textbf{Operator} & \textbf{Beschreibung} \\ \hline - $\sim$ & logisches NOT\\ + \textbf{Operator} & \textbf{Beschreibung} \erh \\ \hline + $\sim$ & logisches NICHT \erb \\ $\&$ & logisches UND\\ $|$ & logisches ODER\\ $\&\&$ & short-circuit logisches UND\\ @@ -727,10 +724,10 @@ Gleichheit (\varcode{==}) gr\"o{\ss}er oder kleiner als (\varcode{>}, \titlecaption{\label{relationaloperators} Relationale Operatoren in \matlab.}{} \begin{center} - \begin{tabular}{c|c} + \begin{tabular}{cc} \hline - \textbf{Operator} & \textbf{Beschreibung} \\ \hline - $<$ & kleiner als\\ + \textbf{Operator} & \textbf{Beschreibung} \erh \\ \hline + $<$ & kleiner als \erb \\ $>$ & gr\"o{\ss}er als \\ $==$ & gleich \\ $>=$ & gr\"o{\ss}er oder gleich \\ @@ -845,7 +842,7 @@ bestimmten Zeitraums ausw\"ahlen m\"ochte (Abbildung \ref{logicalindexingfig}). -\begin{figure}[h] +\begin{figure}[t] \includegraphics[width= 0.9\columnwidth]{logicalIndexingTime} \titlecaption{Beispiel f\"ur logisches Indizieren.} {Der rot markierte Abschnitt aus den Daten wurde indirekt @@ -1108,8 +1105,8 @@ switch-Anweisung und der case-Anweisung getestet wird. Soll die Ausf\"uhrung einer Schleife abgebrochen oder \"ubersprungen werden, werden die Schl\"usselworte \code{break} und -\code{continue} eingesetzt (Listing \ref{breakcontinuelisting} -zeigt, wie sie eingesetzt werden k\"onnen). +\code{continue} eingesetzt (Listings \ref{continuelisting} +und \ref{continuelisting} zeigen, wie sie eingesetzt werden k\"onnen). \begin{lstlisting}[caption={Abbrechen von Schleifen mit \varcode{break}.}, label=breaklisting] >> x = 1; diff --git a/programmingstyle/lecture/programmingstyle-chapter.tex b/programmingstyle/lecture/programmingstyle-chapter.tex index d82204d..df8f625 100644 --- a/programmingstyle/lecture/programmingstyle-chapter.tex +++ b/programmingstyle/lecture/programmingstyle-chapter.tex @@ -5,7 +5,7 @@ \lstset{inputpath=../code} \graphicspath{{figures/}} -\setcounter{page}{57} +\setcounter{page}{45} \setcounter{chapter}{2} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% diff --git a/statistics/lecture/statistics-chapter.tex b/statistics/lecture/statistics-chapter.tex index ad93f38..fee3bac 100644 --- a/statistics/lecture/statistics-chapter.tex +++ b/statistics/lecture/statistics-chapter.tex @@ -5,7 +5,7 @@ \lstset{inputpath=../code} \graphicspath{{figures/}} -\setcounter{page}{69} +\setcounter{page}{57} \setcounter{chapter}{3} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% From a125bca9ac6626df15fc7e3d614f5d43edc847be Mon Sep 17 00:00:00 2001 From: Jan Benda Date: Thu, 26 Nov 2015 23:40:12 +0100 Subject: [PATCH 12/17] Improved page breaks --- Makefile | 1 + bootstrap/lecture/bootstrap-chapter.tex | 2 +- bootstrap/lecture/bootstrap.tex | 1 + bootstrap/lecture/bootstrapsem.py | 2 +- bootstrap/lecture/permutecorrelation.py | 2 +- .../lecture/designpattern-chapter.tex | 2 +- designpattern/lecture/designpattern.tex | 5 -- likelihood/lecture/likelihood-chapter.tex | 2 +- likelihood/lecture/likelihood.tex | 5 +- likelihood/lecture/mlepropline.py | 2 +- pointprocesses/code/binnedRate.m | 35 +++++++------ pointprocesses/code/convolutionRate.m | 20 +++++--- pointprocesses/code/instantaneousRate.m | 34 +++++++------ pointprocesses/code/{isi_hist.m => isiHist.m} | 4 +- pointprocesses/code/isis.m | 6 ++- .../code/{plot_isi_hist.m => plotISIHist.m} | 8 +-- pointprocesses/code/reconstructStimulus.m | 30 ++++++------ pointprocesses/code/spikeTriggeredAverage.m | 49 +++++++++---------- pointprocesses/lecture/pointprocesses.tex | 18 ++++--- regression/lecture/regression-chapter.tex | 2 +- regression/lecture/regression.tex | 5 +- 21 files changed, 128 insertions(+), 107 deletions(-) rename pointprocesses/code/{isi_hist.m => isiHist.m} (90%) rename pointprocesses/code/{plot_isi_hist.m => plotISIHist.m} (86%) diff --git a/Makefile b/Makefile index 2a9b5ef..a06b476 100644 --- a/Makefile +++ b/Makefile @@ -10,6 +10,7 @@ chapters : $(BASENAME).pdf : $(BASENAME).tex header.tex $(SUBTEXS) pdflatex -interaction=scrollmode $< | tee /dev/stderr | fgrep -q "Rerun to get cross-references right" && pdflatex -interaction=scrollmode $< || true + splitindex $(BASENAME).idx again : pdflatex $(BASENAME).tex diff --git a/bootstrap/lecture/bootstrap-chapter.tex b/bootstrap/lecture/bootstrap-chapter.tex index 7ecd9a5..29816da 100644 --- a/bootstrap/lecture/bootstrap-chapter.tex +++ b/bootstrap/lecture/bootstrap-chapter.tex @@ -5,7 +5,7 @@ \lstset{inputpath=../code} \graphicspath{{figures/}} -\setcounter{page}{81} +\setcounter{page}{69} \setcounter{chapter}{4} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% diff --git a/bootstrap/lecture/bootstrap.tex b/bootstrap/lecture/bootstrap.tex index 7a4fbe8..30fd834 100644 --- a/bootstrap/lecture/bootstrap.tex +++ b/bootstrap/lecture/bootstrap.tex @@ -116,6 +116,7 @@ eine ganze Verteilung von Mittelwerten generieren (\figref{bootstrapsemfig}). Die Standardabweichung dieser Verteilung ist dann der gesuchte Standardfehler des Mittelwerts. +\pagebreak[4] \begin{exercise}{bootstrapsem.m}{bootstrapsem.out} Erzeuge die Verteilung der Mittelwerte einer Stichprobe durch Bottstrapping, um daraus den Standardfehler des Mittelwerts zu bestimmen. diff --git a/bootstrap/lecture/bootstrapsem.py b/bootstrap/lecture/bootstrapsem.py index 7b9ac22..347f40f 100644 --- a/bootstrap/lecture/bootstrapsem.py +++ b/bootstrap/lecture/bootstrapsem.py @@ -2,7 +2,7 @@ import numpy as np import matplotlib.pyplot as plt plt.xkcd() -fig = plt.figure( figsize=(6,4) ) +fig = plt.figure( figsize=(6,3.5) ) rng = np.random.RandomState(637281) nsamples = 100 diff --git a/bootstrap/lecture/permutecorrelation.py b/bootstrap/lecture/permutecorrelation.py index 580e12b..0f2ac14 100644 --- a/bootstrap/lecture/permutecorrelation.py +++ b/bootstrap/lecture/permutecorrelation.py @@ -2,7 +2,7 @@ import numpy as np import matplotlib.pyplot as plt plt.xkcd() -fig = plt.figure( figsize=(6,4) ) +fig = plt.figure( figsize=(6,3.5) ) rng = np.random.RandomState(637281) # generate correlated data: diff --git a/designpattern/lecture/designpattern-chapter.tex b/designpattern/lecture/designpattern-chapter.tex index 4a44fbf..31c6e00 100644 --- a/designpattern/lecture/designpattern-chapter.tex +++ b/designpattern/lecture/designpattern-chapter.tex @@ -5,7 +5,7 @@ \lstset{inputpath=../code} \graphicspath{{figures/}} -\setcounter{page}{133} +\setcounter{page}{121} \setcounter{chapter}{8} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% diff --git a/designpattern/lecture/designpattern.tex b/designpattern/lecture/designpattern.tex index 1965ee8..1c1a8be 100644 --- a/designpattern/lecture/designpattern.tex +++ b/designpattern/lecture/designpattern.tex @@ -75,7 +75,6 @@ Zufallsgeneratoren geben oft nur Zufallszahlen mit festen Mittelwerten und Standardabweichungen (auch Skalierungen) zur\"uck. Multiplikation mit einem Faktor skaliert die Standardabweichung und Addition einer Zahl verschiebt den Mittelwert. - \begin{lstlisting}[caption={Skalierung von Zufallszahlen}] % 100 random numbers draw from a Gaussian distribution with mean 0 and standard deviation 1. x = randn(100, 1); @@ -85,7 +84,6 @@ mu = 4.8; sigma = 2.3; y = randn(100, 1)*sigma + mu; \end{lstlisting} - Das gleiche Prinzip ist manchmal auch sinnvoll f\"ur \code{zeros()} oder \code{ones()}: \begin{lstlisting}[caption={Skalierung von \varcode{zeros()} und \varcode{ones()}}] x = -1:0.01:2; % Vektor mit x-Werten @@ -146,12 +144,10 @@ Die \code{histogram()} Funktion macht das mit den entsprechenden Parametern auto x = randn(100, 1); % irgendwelche reellwertige Daten histogram(x, 'Normalization', 'pdf'); \end{lstlisting} - \begin{lstlisting}[caption={Probability mit der \varcode{histogram()}-Funktion}] x = randi(6, 100, 1); % irgendwelche integer Daten histogram(x, 'Normalization', 'probability'); \end{lstlisting} - So geht es mit der \code{hist()}-Funktion: \begin{lstlisting}[caption={Probability-density-function mit der \varcode{hist()}- und \varcode{bar()}-Funktion}] x = randn(100, 1); % irgendwelche reellwertige Daten @@ -159,7 +155,6 @@ x = randn(100, 1); % irgendwelche reellwertige Daten h = h/sum(h)/(b(2)-b(1)); % normieren zu einer Wahrscheinlichkeitsdichte bar(b, h); % und plotten. \end{lstlisting} - \begin{lstlisting}[caption={Probability mit der \varcode{hist()}- und \varcode{bar()}-Funktion}] x = randi(6, 100, 1); % irgendwelche integer Daten [h, b] = hist(x); % Histogram berechnen diff --git a/likelihood/lecture/likelihood-chapter.tex b/likelihood/lecture/likelihood-chapter.tex index 0f74fe3..714919a 100644 --- a/likelihood/lecture/likelihood-chapter.tex +++ b/likelihood/lecture/likelihood-chapter.tex @@ -5,7 +5,7 @@ \lstset{inputpath=../code} \graphicspath{{figures/}} -\setcounter{page}{101} +\setcounter{page}{89} \setcounter{chapter}{6} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% diff --git a/likelihood/lecture/likelihood.tex b/likelihood/lecture/likelihood.tex index 6a8e210..6c98f37 100644 --- a/likelihood/lecture/likelihood.tex +++ b/likelihood/lecture/likelihood.tex @@ -118,10 +118,11 @@ diesem Mittelwert gezogen worden sind (\figref{mlemeanfig}). Wahrscheinlichkeiten) f\"ur den Mittelwert als Parameter. Vergleiche die Position der Maxima mit dem aus den Daten berechneten Mittelwert. - \newpage + \pagebreak[4] \end{exercise} +\pagebreak[4] %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{Kurvenfit als Maximum-Likelihood Sch\"atzung} Beim \determ{Kurvenfit} soll eine Funktion $f(x;\theta)$ mit den Parametern @@ -251,7 +252,7 @@ z.B. dem Gradientenabstieg, gel\"ost wird \matlabfun{mle()}. \begin{exercise}{mlegammafit.m}{mlegammafit.out} Erzeuge Gammaverteilte Zufallszahlen und benutze Maximum-Likelihood, um die Parameter der Gammafunktion aus den Daten zu bestimmen. - \newpage + \pagebreak \end{exercise} diff --git a/likelihood/lecture/mlepropline.py b/likelihood/lecture/mlepropline.py index fc28d48..fcaa97a 100644 --- a/likelihood/lecture/mlepropline.py +++ b/likelihood/lecture/mlepropline.py @@ -2,7 +2,7 @@ import numpy as np import matplotlib.pyplot as plt plt.xkcd() -fig = plt.figure( figsize=(6,4) ) +fig = plt.figure( figsize=(6,3.5) ) # the line: slope = 2.0 diff --git a/pointprocesses/code/binnedRate.m b/pointprocesses/code/binnedRate.m index fd8996d..e34366c 100644 --- a/pointprocesses/code/binnedRate.m +++ b/pointprocesses/code/binnedRate.m @@ -1,19 +1,24 @@ -function [time, rate] = binned_rate(spike_times, bin_width, dt, t_max) -% Calculates the firing rate with the binning method. The hist funciton is -% used to count the number of spikes in each bin. +function [time, rate] = binned_rate(spikes, bin_width, dt, t_max) +% PSTH computed with binning method. +% The hist funciton is used to count the number of spikes in each bin. +% +% [time, rate] = binned_rate(spikes, bin_width, dt, t_max) +% % Arguments: -% spike_times, vector containing the times of the spikes. -% bin_width, the width of the bins in seconds. -% dt, the temporal resolution. -% t_max, the tiral duration. +% spikes : vector containing the times of the spikes. +% bin_width: the width of the bins in seconds. +% dt : the temporal resolution. +% t_max : the tiral duration. % -% Returns two vectors containing the time and the rate. +% Returns: +% two vectors containing the time and the rate. -time = 0:dt:t_max-dt; -bins = 0:bin_width:t_max; -rate = zeros(size(time)); - -h = hist(spike_times, bins) ./ bin_width; -for i = 2:length(bins) - rate(round(bins(i - 1) / dt) + 1:round(bins(i) / dt)) = h(i); + time = 0:dt:t_max-dt; + bins = 0:bin_width:t_max; + rate = zeros(size(time)); + h = hist(spikes, bins) ./ bin_width; + for i = 2:length(bins) + rate(round(bins(i - 1) / dt) + 1:round(bins(i) / dt)) = h(i); + end end + diff --git a/pointprocesses/code/convolutionRate.m b/pointprocesses/code/convolutionRate.m index 31bd06d..dbe0dae 100644 --- a/pointprocesses/code/convolutionRate.m +++ b/pointprocesses/code/convolutionRate.m @@ -1,16 +1,20 @@ -function [time, rate] = convolution_rate(spike_times, sigma, dt, t_max) -% Calculates the firing rate with the convolution method. +function [time, rate] = convolution_rate(spikes, sigma, dt, t_max) +% PSTH computed with convolution method. +% +% [time, rate] = convolution_rate(spikes, sigma, dt, t_max) +% % Arguments: -% spike_times, a vector containing the spike times. -% sigma, the standard deviation of the Gaussian kernel in seconds. -% dt, the temporal resolution in seconds. -% t_max, the trial duration in seconds. +% spikes: a vector containing the spike times. +% sigma : the standard deviation of the Gaussian kernel in seconds. +% dt : the temporal resolution in seconds. +% t_max : the trial duration in seconds. % -% Returns two vectors containing the time and the rate. +% Returns: + two vectors containing the time and the rate. time = 0:dt:t_max - dt; rate = zeros(size(time)); -spike_indices = round(spike_times / dt); +spike_indices = round(spikes / dt); rate(spike_indices) = 1; kernel = gauss_kernel(sigma, dt); diff --git a/pointprocesses/code/instantaneousRate.m b/pointprocesses/code/instantaneousRate.m index c8a4da5..8928c31 100644 --- a/pointprocesses/code/instantaneousRate.m +++ b/pointprocesses/code/instantaneousRate.m @@ -1,22 +1,24 @@ -function [time, rate] = instantaneous_rate(spike_times, dt, t_max) -% Function calculates the firing rate as the inverse of the interspike -% interval. +function [time, rate] = instantaneous_rate(spikes, dt, t_max) +% Firing rate as the inverse of the interspike interval. +% +% [time, rate] = instantaneous_rate(spikes, dt, t_max) +% % Arguments: -% spike_times, vector containing the times of the spikes. -% dt, the temporal resolutions of the recording. -% t_max, the duration of the trial. +% spikes: vector containing the times of the spikes. +% dt : the temporal resolutions of the recording. +% t_max : the duration of the trial. % -% Returns the vector representing time and a vector containing the rate. +% Returns: +% the vector representing time and a vector containing the rate. -time = 0:dt:t_max-dt; -rate = zeros(size(time)); + time = 0:dt:t_max-dt; + rate = zeros(size(time)); -isis = diff([0 spike_times]); -inst_rate = 1 ./ isis; -spike_indices = [1 round(spike_times ./ dt)]; + isis = diff([0 spikes]); + inst_rate = 1 ./ isis; + spike_indices = [1 round(spikes ./ dt)]; -for i = 2:length(spike_indices) - rate(spike_indices(i - 1):spike_indices(i)) = inst_rate(i - 1); + for i = 2:length(spike_indices) + rate(spike_indices(i - 1):spike_indices(i)) = inst_rate(i - 1); + end end - - diff --git a/pointprocesses/code/isi_hist.m b/pointprocesses/code/isiHist.m similarity index 90% rename from pointprocesses/code/isi_hist.m rename to pointprocesses/code/isiHist.m index f529f8c..4f28f32 100644 --- a/pointprocesses/code/isi_hist.m +++ b/pointprocesses/code/isiHist.m @@ -1,7 +1,7 @@ -function [pdf, centers] = isi_hist(isis, binwidth) +function [pdf, centers] = isiHist(isis, binwidth) % Compute normalized histogram of interspike intervals. % -% [pdf, centers] = isi_hist(isis, binwidth) +% [pdf, centers] = isiHist(isis, binwidth) % % Arguments: % isis: vector of interspike intervals in seconds diff --git a/pointprocesses/code/isis.m b/pointprocesses/code/isis.m index 869cb60..b927abd 100644 --- a/pointprocesses/code/isis.m +++ b/pointprocesses/code/isis.m @@ -2,7 +2,12 @@ function isivec = isis( spikes ) % returns a single list of isis computed from all trials in spikes % % isivec = isis( spikes ) +% +% Arguments: % spikes: a cell array of vectors of spike times in seconds +% isivec: a column vector with all the interspike intervalls +% +% Returns: % isivec: a column vector with all the interspike intervalls isivec = []; @@ -13,4 +18,3 @@ function isivec = isis( spikes ) isivec = [ isivec; difftimes(:) ]; end end - diff --git a/pointprocesses/code/plot_isi_hist.m b/pointprocesses/code/plotISIHist.m similarity index 86% rename from pointprocesses/code/plot_isi_hist.m rename to pointprocesses/code/plotISIHist.m index 9fb6bf9..e181c3a 100644 --- a/pointprocesses/code/plot_isi_hist.m +++ b/pointprocesses/code/plotISIHist.m @@ -1,7 +1,7 @@ -function plot_isi_hist(isis, binwidth) +function plotISIHist(isis, binwidth) % Plot and annotate histogram of interspike intervals. % -% isihist(isis, binwidth) +% plotISIHist(isis, binwidth) % % Arguments: % isis: vector of interspike intervals in seconds @@ -9,9 +9,9 @@ function plot_isi_hist(isis, binwidth) % compute normalized histogram: if nargin < 2 - [pdf, centers] = isi_hist(isis); + [pdf, centers] = isiHist(isis); else - [pdf, centers] = isi_hist(isis, binwidth); + [pdf, centers] = isiHist(isis, binwidth); end % plot: diff --git a/pointprocesses/code/reconstructStimulus.m b/pointprocesses/code/reconstructStimulus.m index 51cb0b1..6c46a40 100644 --- a/pointprocesses/code/reconstructStimulus.m +++ b/pointprocesses/code/reconstructStimulus.m @@ -1,19 +1,19 @@ -function s_est = reconstructStimulus(spike_times, sta, stim_duration, dt) -% Function estimates the stimulus from the Spike-Triggered-Average -% (sta). +function s_est = reconstructStimulus(spikes, sta, duration, deltat) +% Estimate the stimulus from the spike-triggered-average (STA). +% +% s_est = reconstructStimulus(spikes, sta, duration, deltat) +% % Arguments: -% spike_times, a vector containing the spike times in seconds. -% sta, a vector containing the spike-triggered-average. -% stim_duration, the total duration of the stimulus. -% dt, the sampling interval given in seconds. +% spikes : a vector containing the spike times in seconds. +% sta : a vector containing the spike-triggered-average. +% duration: the total duration of the stimulus. +% deltat : the time step of the stimulus in seconds. % % Returns: -% the estimated stimulus. - -s_est = zeros(round(stim_duration / dt), 1); - -binary_spikes = zeros(size(s_est)); -binary_spikes(round(spike_times ./ dt)) = 1; - -s_est = conv(binary_spikes, sta, 'same'); +% s_est: vector with the estimated stimulus. + s_est = zeros(round(duration / deltat), 1); + binary_spikes = zeros(size(s_est)); + binary_spikes(round(spikes ./ deltat)) = 1; + s_est = conv(binary_spikes, sta, 'same'); +end diff --git a/pointprocesses/code/spikeTriggeredAverage.m b/pointprocesses/code/spikeTriggeredAverage.m index 6954f43..fcc0352 100644 --- a/pointprocesses/code/spikeTriggeredAverage.m +++ b/pointprocesses/code/spikeTriggeredAverage.m @@ -1,32 +1,31 @@ -function [sta, std_sta, valid_spikes] = spikeTriggeredAverage(stimulus, spike_times, count, sampling_rate) -% Function estimates the Spike-Triggered-Average (sta). +function [sta, std_sta, n_spikes] = spikeTriggeredAverage(stimulus, spikes, count, deltat) +% Estimate the spike-triggered-average (STA). +% +% [sta, std_sta, n_spikes] = spikeTriggeredAverage(stimulus, spikes, count, deltat) % % Arguments: -% stimulus, a vector containing stimulus intensities -% as a function of time. -% spike_times, a vector containing the spike times -% in seconds. -% count, the number of datapoints that are taken around -% the spike times. -% sampling_rate, the sampling rate of the stimulus. +% stimulus: vector of stimulus intensities as a function of time. +% spikes : vector with spike times in seconds. +% count : number of datapoints that are taken around the spike times. +% deltat : the time step of the stimulus in seconds. % % Returns: -% the sta, a vector containing the staandard deviation and -% the number of spikes taken into account. +% sta : vector with the STA. +% std_sta : standard deviation of the STA. +% n_spikes: number of spikes contained in STA. -snippets = zeros(numel(spike_times), 2*count); -valid_spikes = 1; -for i = 1:numel(spike_times) - t = spike_times(i); - index = round(t*sampling_rate); - if index <= count || (index + count) > length(stimulus) - continue + snippets = zeros(numel(spikes), 2*count); + n_spikes = 0; + for i = 1:numel(spikes) + t = spikes(i); + index = round(t/deltat); + if index <= count || (index + count) > length(stimulus) + continue + end + snippets(n_spikes,:) = stimulus(index-count:index+count-1); + n_spikes = n_spikes + 1; end - snippets(valid_spikes,:) = stimulus(index-count:index+count-1); - valid_spikes = valid_spikes + 1; + snippets(n_spikes+1:end,:) = []; + sta = mean(snippets, 1); + std_sta = std(snippets,[],1); end - -snippets(valid_spikes:end,:) = []; - -sta = mean(snippets, 1); -std_sta = std(snippets,[],1); diff --git a/pointprocesses/lecture/pointprocesses.tex b/pointprocesses/lecture/pointprocesses.tex index 3ca29cc..8437aa4 100644 --- a/pointprocesses/lecture/pointprocesses.tex +++ b/pointprocesses/lecture/pointprocesses.tex @@ -86,7 +86,7 @@ heisen die Intervalle auch \determ{Interspikeintervalle} \"ublichen Gr\"o{\ss}en beschrieben werden. \begin{figure}[t] - \includegraphics[width=1\textwidth]{isihexamples}\hfill + \includegraphics[width=0.96\textwidth]{isihexamples}\vspace{-2ex} \titlecaption{\label{isihexamplesfig}Interspikeintervall Histogramme}{der in \figref{rasterexamplesfig} gezeigten Spikes.} \end{figure} @@ -113,15 +113,15 @@ heisen die Intervalle auch \determ{Interspikeintervalle} \frac{\sigma_{ISI}^2}{2\mu_{ISI}^3}$. \end{itemize} -\begin{exercise}{isi_hist.m}{} - Schreibe eine Funktion \code{isi\_hist()}, die einen Vektor mit Interspikeintervallen +\begin{exercise}{isiHist.m}{} + Schreibe eine Funktion \code{isiHist()}, die einen Vektor mit Interspikeintervallen entgegennimmt und daraus ein normiertes Histogramm der Interspikeintervalle berechnet. \end{exercise} -\begin{exercise}{plot_isi_hist.m}{} +\begin{exercise}{plotISIHist.m}{} Schreibe eine Funktion, die die Histogrammdaten der Funktion - \code{isi\_hist()} entgegennimmt, um das Histogramm zu plotten. Im + \code{isiHist()} entgegennimmt, um das Histogramm zu plotten. Im Plot sollen die Interspikeintervalle in Millisekunden aufgetragen werden. Das Histogramm soll zus\"atzlich mit Mittelwert, Standardabweichung und Variationskoeffizient der @@ -155,6 +155,7 @@ Intervalls mit sich selber). \begin{exercise}{isiserialcorr.m}{} Schreibe eine Funktion \code{isiserialcorr()}, die einen Vektor mit Interspikeintervallen entgegennimmt und daraus die seriellen Korrelationen berechnet und plottet. + \pagebreak[4] \end{exercise} @@ -395,6 +396,7 @@ vorkommen k\"onnen nicht aufgl\"ost werden. Mit der Wahl der Binweite wird somit eine Annahme \"uber die relevante Zeitskala des Spiketrains gemacht. +\pagebreak[4] \begin{exercise}{binnedRate.m}{} Implementiere die Absch\"atzung der Feuerrate mit der ``binning'' Methode. Plotte das PSTH. @@ -435,6 +437,7 @@ Binweite, die zeitliche Aufl\"osung von $r(t)$. Die Breite des Kerns macht also auch wieder eine Annahme \"uber die relevante Zeitskala des Spiketrains. +\pagebreak[4] \begin{exercise}{convolutionRate.m}{} Verwende die Faltungsmethode um die Feuerrate zu bestimmen. Plotte das Ergebnis. @@ -490,10 +493,13 @@ die Zellantwort mit dem STA verfaltet. Implementiere eine Funktion, die den STA ermittelt. Verwende dazu den Datensatz \file{sta\_data.mat}. Die Funktion sollte folgende R\"uckgabewerte haben: + \vspace{-1ex} \begin{itemize} + \setlength{\itemsep}{0ex} \item den Spike-Triggered-Average. \item die Standardabweichung der individuellen STAs. - \item die Anzahl Aktionspotentiale, die dem STA zugrunde liegen. + \item die Anzahl Aktionspotentiale, die zur Berechnung des STA verwendet wurden. + \vspace{-2ex} \end{itemize} \end{exercise} diff --git a/regression/lecture/regression-chapter.tex b/regression/lecture/regression-chapter.tex index 0df5e2b..27ab07c 100644 --- a/regression/lecture/regression-chapter.tex +++ b/regression/lecture/regression-chapter.tex @@ -5,7 +5,7 @@ \lstset{inputpath=../code} \graphicspath{{figures/}} -\setcounter{page}{89} +\setcounter{page}{77} \setcounter{chapter}{5} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% diff --git a/regression/lecture/regression.tex b/regression/lecture/regression.tex index eaceaa0..ffa32c2 100644 --- a/regression/lecture/regression.tex +++ b/regression/lecture/regression.tex @@ -84,7 +84,8 @@ zus\"atzlich gro{\ss}e Abst\"ande st\"arker gewichtet. Schreibe eine Funktion \code{meanSquareError()}, die die mittlere quadratische Abweichung zwischen einem Vektor mit den beobachteten Werten $y$ und einem Vektor mit den entsprechenden Vorhersagen - $y^{est}$ berechnet.\newpage + $y^{est}$ berechnet. + \pagebreak[4] \end{exercise} @@ -315,6 +316,7 @@ partielle Ableitung nach $m$ durch Parametersatz $(m, b)$ der Geradengleichung als 2-elementigen Vektor sowie die $x$- und $y$-Werte der Messdaten als Argumente entgegennimmt und den Gradienten an dieser Stelle zur\"uckgibt. + \pagebreak[4] \end{exercise} \begin{exercise}{errorGradient.m}{} @@ -376,6 +378,7 @@ Punkte in Abbildung \ref{gradientdescentfig} gro{\ss}. Funktion der Optimierungsschritte zeigt. \item Erstelle einen Plot, der den besten Fit in die Daten plottet. \end{enumerate} + \pagebreak \end{exercise} From 7719cb33859cf8b152a46612fb501b6d89a3f76f Mon Sep 17 00:00:00 2001 From: Jan Benda Date: Fri, 27 Nov 2015 19:29:39 +0100 Subject: [PATCH 13/17] More pagebreak fixing --- header.tex | 2 +- plotting/code/automatic_plot.m | 18 ++--- plotting/lecture/images/spike_detection.pdf | Bin 48716 -> 48398 bytes plotting/lecture/plotting.tex | 62 +++++++++--------- programming/lecture/programming-chapter.tex | 2 +- programmingstyle/lecture/programmingstyle.tex | 4 +- statistics/code/checkmymedian.m | 8 +-- statistics/code/gaussianbins.m | 13 ++-- statistics/code/gaussianpdf.m | 7 +- statistics/lecture/boxwhisker.py | 2 +- statistics/lecture/pdfprobabilities.py | 2 +- statistics/lecture/quartile.py | 2 +- statistics/lecture/statistics.tex | 45 +++++++------ 13 files changed, 81 insertions(+), 86 deletions(-) diff --git a/header.tex b/header.tex index aede0ad..e13c850 100644 --- a/header.tex +++ b/header.tex @@ -216,7 +216,7 @@ \newcommand{\varcode}[1]{\setlength{\fboxsep}{0.5ex}\colorbox{codeback}{\texttt{#1}}} \newcommand{\code}[2][]{\varcode{#2}\ifthenelse{\equal{#1}{}}{\protect\sindex[code]{#2}}{\protect\sindex[code]{#1}}} \newcommand{\matlab}{\texorpdfstring{MATLAB$^{\copyright}$}{MATLAB}} -\newcommand{\matlabfun}[2][]{(\tr{\matlab-function}{\matlab-Funktion} \setlength{\fboxsep}{0.5ex}\colorbox{codeback}{\texttt{#1}})\ifthenelse{\equal{#1}{}}{\protect\sindex[code]{#2}}{\protect\sindex[code]{#1}}} +\newcommand{\matlabfun}[2][]{(\tr{\matlab-function}{\matlab-Funktion} \setlength{\fboxsep}{0.5ex}\colorbox{codeback}{\texttt{#2}})\ifthenelse{\equal{#1}{}}{\protect\sindex[code]{#2}}{\protect\sindex[code]{#1}}} %%%%% exercises environment: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % usage: diff --git a/plotting/code/automatic_plot.m b/plotting/code/automatic_plot.m index a923324..0b26a39 100644 --- a/plotting/code/automatic_plot.m +++ b/plotting/code/automatic_plot.m @@ -1,15 +1,11 @@ -clear all -close all - load('pyramidal_response.mat') threshold = 20; % mV -figure() hold on -plot(time*1000.0, neuronal_data, 'color', [0.2 0.5 0.7], 'linewidth', 1., ... - 'displayname', 'Membrane voltage') -plot(spikes*1000.0, ones(size(spikes)) .* threshold, 'r.', 'markersize', 15, ... - 'displayname', 'Spike times') +plot(time*1000.0, neuronal_data, 'color', [0.2 0.5 0.7], ... + 'linewidth', 1., 'displayname', 'Membrane voltage') +plot(spikes*1000.0, ones(size(spikes)) .* threshold, 'r.', ... + 'markersize', 15, 'displayname', 'Spike times') line([time(1) time(end)], [threshold threshold], 'linestyle', '--', ... 'linewidth', 0.75, 'color', [0.5 0.5 0.5], 'displayname', 'Threshold') @@ -24,7 +20,7 @@ set(l,'location','northeast', 'fontsize', 11, 'linewidth', 1.); set(gca, 'xminortick','on','yminortick','on') set(gca, 'tickdir','out', 'linewidth', 1.5, 'fontname', 'times', ... 'fontsize', 11) -set(gcf, 'paperunits', 'centimeters', 'papersize', [15 7.5]); -set(gcf, 'paperposition',[0.0 0.0 15, 7.5], 'color', 'white') +set(gcf, 'paperunits', 'centimeters', 'papersize', [15 7]); +set(gcf, 'paperposition',[0.0 0.0 15, 7], 'color', 'white') -saveas(gcf, [pwd '/../lecture/images/spike_detection.pdf'], 'pdf') +saveas(gcf, 'spike_detection.pdf', 'pdf') \ No newline at end of file diff --git a/plotting/lecture/images/spike_detection.pdf b/plotting/lecture/images/spike_detection.pdf index 1864b4b809231f6523de6bea858ae8b35e050b20..e27de96370df59ecefd7f6dbf5ce459fd33b61ab 100644 GIT binary patch delta 46685 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

1^_&m6~pv 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 UG%>~E;(5*u79E|0q9oS;0V;;e(EtDd delta 47003 zcmV)BK*PU|`U1@S0+2|5&(80-k|egTr>Ld9DU*^&Nm~QPtUb2@KfnMUV{p#^4KL>P z{fQZo8JRq{J$KiQ!l~~U!Q@}1$V?_B{p+9Yul{HI{=?t@^6QWP?LXgt{@4Hak3RnV zAAj^e|J%>M|MbTg*I#`;f1a)V`O8s%&-vH9|NQ$O=QGx?o%wQq{5|FW`yYS%qitno z`M>@D*7&zS?*57d(eaq%Co!8!5UIp-s07h5@4p7x`CtF|*FX9ip+E8Gzx?|1fB%=C zQTl03|MOq|?>}td`k(jp*PLG)uRs6g*B}4OZ0&#jm;d(1|M4$>{GWfkr&dFx4e9Or zA#X?!C5b*%0w_s;98)ELlEitd1kisV3BNG^vlpfRT+;a|rd^arE=s>1tpX@DV!SE= zlqBw-`jPzoOli;IY2VM3_MV>h{rq>8_RkOUb8vurlMz1J#gf-gt@Y@`)4rc6?UQDE4R1Y21@p{SM&s6Jw-8}94nbMx#{(4R(10{*~ zPzfNFINK=_ME`*#{`sr$9)Go;oV*g3T#54sNgY6`6~|Bspd@ill>kZ-*R2vjNn$)I z0rVe8;-9`MKckSYiY~V2e6FKqP=vqF5j6MmXFy`JZj&b(%$R%&)P>YHGC8 z>v)cz-v88pa(<&=NZW8t`%4L8l^NGqEu;*w%FN@IdJJj$4f}`^#Q#BLaE(;ze_ETK zpDf=9-B`o6YjnT;uc>VT*0wzN`PV7efLLYT5m(^*t!cfPZOe4xB-8uzQ)tKl{|Ax5 zHBza6_8Rqe|MhmeP{)3uzLoO3nY}^4sX<4&;{cO?#QEK0aw&k5%(d>ZkO59IBi(a= z|Gp)7jY8(1zC_paQ^dJ0(fON8G<%Dtd>}Psez%qkJ#dn_*R2&Yz)9wjTWx`q`j&g` z{ms4h?^lM`NTmMhi}d5}++$s%E3VPM{;oDK$IF@Z$5;Ovxe?Kx|L2eY>(BrGwdjBR z(f;ax@B5CQ`hO(aU-NyB{{H!&|I;56^W(WLl%s26W}P?I$IBGa@v%vaUYYa3+&h0d zc^+)2p_F!=icYJ^R?i=VRn(aljJ4uCqi!(AE^~SPWZFV&#Xq723-^Lg_TQurAnS!n z8xxnsWsa*dEyjRb6B`39QyJ9#xi&|`FRAZ;=Z+!L$3-3`Wrz?IeTi^?YrJ8b&JpOPh)gK{iUE7i6Rd z)T6U9$Hv6nK_>38$8;)Mxv=DbzSw<1B6=6{V4hHi3y*;63vF3f$y3u04>C^Ly$zI*O7w`>}o0rKp>8 zU6F`u_eNVr8rwAIz0@Vi2YuU^bI%py1zn1Jh>Tm{&Y;)SQ1-xPySTaw#|(?~Xv3}d z_*-YYzx^?B?XFI*fXt7N_vN{ucQ49+Ab$Khfw`8aH@_{a$NTq#uCC~Oyr%>D^-8)i zQ8t*X^}?Kw_Yrs2`GgFZm=DR^k!xw&+v4{vzn|6D0S$Xx=g7D}88T0mxuajuJJhhP zz@8rUPzLwL_+}Wt%7*ysPW%*PBQ;|*$#|)_!=ql#f0Q7OGQiy9xANwXM|lf>(;6Aj ztUG$n*)gsZwJ+tEhTb%eKr_afx*6qD#+h%Mbb9+f#I}FGA4#dB=gcN^d+VKvT-3af z>3PhEL#O5;yBa{V$#3R7>v)ox8zVit>bQ})S>rB|H0wig#Xcl07~7bD@%|Pq#0cw1 zlWB^ij=7DPt-)``rYH8>G-y(PpQ0`@(N{8lNB<_*u2-8jlHsU+oA6QQhhlaAP~81X zGAvT+)KwX`@~LA@5m&vEx-@7+J8bTw>_V}^yN3~WZFnGS{Wv)LnlBvKa~wyEzx|F` z_(-)M)YYcw&S^dhMVdQl648F>vb1V{)D_ERq73LS z*HqxEN1nB7*jf>w0=NZS$9A zv-ZiAUD9k+*3Lzw`#8czk{+MbT5q4rj4Bf&dzwC>j|*Mlr2$(THhm%^{X6SSa8iS! zXI!bzDr5KCDf)e;S@d*&4O@KllQU?PxY?FuCQIICL^58t&4^K^t;|uY&7hR#j2Go? zbKtqH-3-~ISDX=9Cb8L(O~>qNZf~|&87|s-t`%g$zabOW*2VRdrIh)QIP9j&W+)$B z!?9vsY1O@`C(#D#Ns)+o<)Ti6)ePp{WWv6~S(;>)&A=Up6OkR4s)gkiCkvCr4jqu1!YsOuU7_OE>V_$Dgt+YrLH8A~!8dtKYHD zK;xxt_;{&gh9J(5ftObP{Qu%k&id{5|A%6JY-vVp^j>^K8)rVhdX(v2I`SCmb!8w! zkI*Fytr_l+-{CKR8@3s^owz=J50K&dK+GMXhR9lYs?OY5BK&VMJ@R}lh!%|`{k1$s z66@$C(#D7k)=l%^+qR05;qKCE=@om8hOa1Z;n-tp)MB3*oQX2P*p3Pj_cSnCS|-=j zD1kB<>7Og)E&hIY{6ghzHf*~&P7{I|>$NUPXKxpO{jis-#` z>XnaSk>`r)_XwGokI96s(vua|lLyj=&S6V3+RnLhDB`^BsZw%Xi#zAUp~%+yzIiG= z&vL-F0(S9H`jb}>;_$o4NYA+1M%&0lf4Sy{mDiH}-E@ur(38@vb;oAUk%={lO!SqW zfY{&36G@(b!&)KesXQy#Wxj~(1+cf4>AnWQlkru8p2}K59W9?S(xSBLEjV*+G9zS$ z_<##tQ;|x-a*6&pqv$roeU*@QCLv$VoQeAHy{z_MFhdY6BTs#a&5MoP zOUqKK*2WnwMv-=2l?fj(a>Xdna+`(GlDP__Enk%6mEUodR?2T=piy_mujB*69J<~* za<657yxHdfj%y2SWl@(B^8I0F-d35=;J11k&cuxCGEuVnNeexVzi#%Ft7=me_Xe5! z*_h}peTB$H&0{U$O{CLj6X#TX2i@E5yX-y&u`lm3>8?(@?v@sLw>FRJbva|#iF@Vn zhaF3MIEPaL)`GV{W^DT%W4P_4JM(YKa1OqIHYUczz52?;NUdG^IzD*m-loV2*HZ&2hD_sf~{7?Owe-;HNPGLAA`!cS#5b}zWIrfNiFp)=p&u%PqM$7di(G43T7VviQF6o(HE;)^DCT;kZ#3Q!1`GbuL;=t$Zuv=N;A~JAN|5kmvu=rVU7ju?Yk?_bJDz47tbV$Hag>NJj%Ryqn#p+ozt~FDaW!qjmG0Y><|Q%4 z5_6izVK6GhF_$vR5_3Hno3n^;dMo5D)$UK%!YiL51HK}?o>z1x?s1oiUT}w}DUvba z9nCiC{?0;iRX;QmI%C}H-j6eqpXa_fqOOHi!sc;{w{SkZ%3XZry&hnHxfay87z=7# zj2C61$8VnDh(}AQUgpp<4u+Z{_XaG@?|7c^f+g=*a#MS}ZO(Wf$&8RW@~9ZL)-!GW zt{$~BaR-u-(yB-83~C_q5gxijxKOOI3&n`=q*kxoQ@7IPNcWMZzLGMleQT)l=5Md|bpW96E4ws)E6m*+yi z=`+TfJvaMyrg?1nk!3ZiRyX&?IlA2Wj`{7_ENwd(6W7OZwCgCAG*82r-AEMra%{67 zPrt;PO@=yihy}HNAMrcx4W4faO(ql8n9JiCO4uvZu4qL))Uvd&ItD;LL4yL5;8k6P5%$S8vgo z&tL)1ftLdR3wBP#1#27mhefgl@}vYCwAQ6FKvTCa0CcQQSdmEr=4+U9eULXqnIQcg9D?G3URG zE%fMbT^B+on7or@SaV>X)7Re@zps;fF~N8#WNd7Idp+~z%$3v8_ik|x9~Z->MLpsn zZ?EUPoN+%OWH4?n5p6~6Bd#i$c2=3Va)&-8^`VHvth8GYtQ?WH(Fv`f%o7YF(HIlr z8Kux>v~--`_xu()L$B#qNbY*}A!Jyi$CVYujOFPYBQm*7wB+C9o4oWgF1EJ%(aw0= z()@aVY_lmDw_JmX>k^&?eseWI3K37)xHg2>kUD$8Q zrTunK1kDD|un2NSK*(_XKi)gOv~LW?~;>agg4wAWVjGp9=nBUBWYs5cfXcso>&iWNrsCv7Gn*D;lg$3R6y;}B|tKYHSMaXkB@X3D(W4Rnp zL-~{qu=k4TPfou>zMcti#;(I`#1ZAQIdRETV01;MoI(Y_a-CeZ`9$Z3wWQnOq6W9G8v0C!svKd z4rF})*xN@A|s>oo%U~GaW;8!!VoP@ zT6r0ZM)9nF+nKOM`8>eJnD^V`c@g|>w4&`PlW3bsvNichlE6pC;T5|?SjCus1!IiK z92?WD)M)G1wkT-JW_jyKbvE62Y;il z8OI#y5*TaFb5Sejwdfbu*XSANx@b>XQ}2A@8tG5SKV_A0=8hgyCR)PTtSP#q?O;4I z@;u>Ztlw_SE)+Ta6#w&7doY-$DDKKQ=f4oG!^ls@d;etLPIjK_ez74$747iFHxT-HvF6F=!4Negj?@pm4@7>sRHYqak1cOK2kT+s`9 zAkpR;KY5Y&xQ6NpEO>-X4vt3+UfDL z{bA`+)4~#^$pGW>ukT<2w*RwlEj`8J*Rbgy_s7e-UyqR$?9!{`=rV3#9c-1=EYEE-7z2Y;~I8* zXPhIB?gEqD#r@pvWh;r{VhC5UuQw~)%B*L&jQI-h!#f7dwGnrJXCGcBiNhNL=6akl zW&dGjWlpbWEX1Esy7e>00&21DmOC+Af#C)BvlrrURa%bpjy(geWcMrS%;kdw=4dSm z3@ZT_v0qdlGVNto#`k(fb3@lp>@q)?H+r)h7w~lxIs_Vs#UzX+XU2p|CYCUlVHv=@RWOB5X`eBJwf-#8Bl`TIxP~9P zU2d_%?g>X>QiBn*+v*%KT4dZ&2*%sD41jS&8x{`J%WxQff!J8POpl4AU0}G?f$h#K zOgAz!>i99#?r7r=ifd4ulC_-BvBe$oOBh^-mbP134s`(YZfKj4=S&kM=BT^0ETOuu zPuEbzhr$Ve+(mUQa3|Jla2K^H3d7zRA2mFxKK!?qMx#ISr;WMo!Su(SPV~?pJ3lvx z=tbQgdAf{$a(WbfrEv0HDN!>wIbtly3`Kj6&@g{6eOBhKj5svq0d-*1N`oxwppHcU zxp~YU(>aJdG|)CC%&9{UgBm&&MQIFYjg1LYj^QgQkqlbtAun7F3u#>mNqISyM!%1N zAGVABFzAqScnKc<;#D}3x$o)G{+zBMu7#v#-F$n0QjqNNP*=3P9xrevwzGeetA@aw z8JkSZ07sgCjx<+UTFl3MeHHpk6gu&6KK2|~ae9mdS0!hDjIK#N{rP=IZn#sjN}sex zXw$-eYzHk=GTr>owHWqpcaDMMbrT+#MiGKi-F!`DU>Tk?8;2YDUef)9pFoZ<0Km+(VtaD4rkAzmHa;@@# zq$WM$btl*NPOk@ED2}_jn>!;N&T*?U@qmQCA~NIHKuJupbqC(?eT->s7*D!<&xgo2321n2yL-W@BgK5d2%` z=i48C4;jwKJG0u4FkG}Zhvk6dXsBtSD?J2K9&vRXn`SM4 zt?nPeh@rEv5Xi(vpvzdPw%*gO#nCQFk>BBYFmx6cJ((+7 zSC1nE6K(Nh&WdD&QUJOQZg?&}${k+9W=oQ}qg|AVa<>gWXQHLq1F<91`5@RYXXL>v zKN{vbZAZUsPRB8@khV0xbNR5jJd#0wCJtWnU~3$1CS!FJtt7VlfGFnJTaUFa#K$1k zZ?BhOkW*xn#yXA}(qG;hwfV6bMX^TS+w6#!xcZpg`4|ImJW%B?Ke{R-eLm~G?k_-! zdh2mlXL!(lz4WN@myA@JY5cPhw|_Q5(lCM>6OSi4!&za6JDpmGm2P7 zb_|*`$HrXVEac%}9=Dn9rcjQ5hF7Y0m%$^$DPu5fR3fwCrbs)0bQzUp+Q;4GjIT5z zV<;=M6PkL-cs$mBsS=EoV9e+>mo{SU1E+=><5SgP>;Lede&Zv>i{}UD;FUP`ST;xrbyI(9GA3;v#tHS zMzAuhrcXn9XUs7wGj>KgRCSJwj^r+LC$ovfE!WvpQwo7z$;edwB%|GYF*=H3ETM-| zE#zZZdc&$@KVw?56kf=#&$aj$LgW4?b8UX6_UlCNqCEd7HUe@ zH>SmKgV8QQ#+zb_*FzV7z-ZOR95KMmCFKrTa2AZm0W7ugdaYdPxwB(E-Ub`z7vRkq zeC9cKn)cp1b9)BU@0bK9bT=k)GFN5pE!T`maMsz?2$@`GKCMe4?ocyd^|m21TS`Y? z-n={!OHcCcu*_I#;oZ`LdDoeijIUwDQNxXS)+M06F)nvn`-!A~jzgBHJ3oHosZtzP z^^NHpBkTHo)fEa%m+oVp-54=cmIW)t4tdhW;2~9DzLmZfn*g{=5vEsNMi@-!G#D*+ zZliAQl@y%)EfO4eQ!E{LFj9gs+7MH(?%e^FQmO*JWx6nHb|xsDe_Co3K8Y(m=SOnc z1WLqJcwlXAj0_HcWu#)}GE~*_(Z|9FJHV+oDG&?VwD*B#$`C;7+9o5-10!7+Nxj!5 zX-;K>vR(a*YP^Hd-j1@e-OtRoJ+YJmBSG2#M*4miBOYgihNen0U=DbtFa{+5n@lHS z9b7K|3%xD7Ax$pLxAd&<6I|HhFz7zbrSA(pZhYVRzAEE?(=#RZJaIKHQ@a@rzBbng z%(Leb20Nz$rnkeQr&6Fj{UGf!Eq&u^f_c32kN`4mykjKE#I**a)s8$|`sP7PeWgHC z!AA--W@-s0BaEq>mNU1(10%U`dQyO_iAb%4*amj;CX5u~rs%m#s^ovS!GqR%9>den zXz8vRE!h-*A9V9)s0QPM>tbzy5oH5&Mt28Re31d;<@Rbnk#PxI)um810!H3)bwav` zB|lVlREw94Oj-jI>s1+<4#Avgr#OEL$l^EhJUT`-jlgKLH-lizY7UKUxgVQJfS2}E zB8GQM$IL0srK7J%mZd?LUXfl=q`U3e3Xmm!!AQ%0CJ?cTSG6P~mh+}!V9t#hyNuZA zwy=v8pSPK2_3z1OJ!kPr?|BuklMIHN=`iYb5BFPj;6bek`&VGhA3)y3K9U>KvlG%a zj9_r6aJ}Cu!KEy)rUaQ^tF7OE89TC}8)~WD2B}Cx@wXqKpn~P7)Yd zikK^ZIWF+Lu z9$4ZxM$7;(GE|3YBNj`b@a~K_;R-okrIB23z#u@+&myxv5Dg>tmq9+|1#mbhH=#3LI+?fT@ll$H@Pq`^OUi)674`IDncKIbI8f zMj3XvGBO-w1f>dRxh!{HCP=gZ_PFJLF%bsR!GNAhUolUL?wDrA0ALOb-EA#Rg6l!- zxR>m?Y`^C%6m<2<=uAl&&M6l5acu|Ii3}2bV`SaIgV{Y3mu$hcd@}j4H<`=HW-_Vj zUFNb8^5y~`8DoP9$XA^<^6=^My1vTx<}`(-d|q!^Xn}i8mlCSFfpK-Cglrgp;yG=( zp0+Xn#FB z0YLOkLWpdO0drcMn1e*V%uGP<-urb`o$%Zt6z4MY4W(hCKqp^Y**EzoZPIu@9E zq#&r-#vFaih036237uZM;RC65PTgB$>XqRs6`45lLiMEe#zb8&CU94OXlE3i(l?~D zgr}ve@-)|q?`Ir8vqY3S^{Tre>!M#8t->%+>x;j-dll+C6f0@wR{u*qEtw8bw3bo-S=OZ46(B zOjsMvNHc6&^oC@ueN;(*Au0p^D)y|or*9so2<*xy3@r$eiyohDz)M#9fIuiF=nej{(e_mAOTK1}m*}zHZOW(UQR6 z>&Ec&l@!~)+?lxaV8jm_G}eNtaXKLW=4i0POP{a(?>#*4i|M}b{SX-vl#Tl*OIA=>r}IBZZ;s8GpC1h z(r4@h{0fXkvF8O7Fs>I~DjV0QW+$M4|JrUwovE-m3Cn#PY<>^p?8kr#Bm&r7+K#T_FHpz^& zwlY+|qs)eXh(|oq`nn-PM%EjRPAqUM5R>JskuNf`mAQO8%&d4YZ-RfB|y2-Uy(UA6SYx5TOn2dXDj9lB_ z$YcXg;~KL@Jto5#(hD#{(Yxgc?SZ;UN5HhoXerEpwa~>EKH1MVSW%O!)eVM=MxmkP zkgUaIyj@+gU%~M1Cyu$s^9WM~od z;bUumYxXSo`UmOr3vb9g@IjfLS8C`a0vqBZkh#6Mh3|sJAwpmyau}Ao-oh9%=^Jrh zMMB$Y8YUhY7~JWO{H{gVLhf2Hm`sR}|9fkWH0XnI^L|jK9mFNX z$lHRxGuSafiY;6A3W3G2>YEMOyBa@0Y)YC=7h_Z35CGGryaVWmz!WzWiRD<*F{Q=0 z^{b9#ztT93v_IEJ9;vYn4)$k!Xh$}$>3GP{OkF#^^#$(B>oI#Waj$|I(G$d}MqRJnnxGuhhB-PBH_*mZvGYkDMAN?m%$mmPTM!lq!sQHpa`n)6BVG zY!wW|Q=|?uEum-2;pJnZOz4&hd%5|C#b1V0Y4fC)xS%f$h^1%&V49-4$WNr2ehz66 z7#W1C4(k_JxkccctfU0YflW~ox79>{dN?siesRHYn6WBTRV-4XUA75RQy&HFEtE>y zf~9z4py~IfQe>p9#>DQ;_~IqDX04xLAsTG>X}6eWv!U9V=qVy2&&I^k$rB>*XtOaC_ ze{pn16KW>5V^cSu|IQH1Y>F zgLsaPzh`XNkvTV+@ou@K(xoU<+)gm!Y=XIV8BPsHjo%Qx)y2(YX-%Tq~(8c`+gD&aPZ#Z#nDhGh)^^K1-m28*zy9LC5R0fq)>`w3M3bVj19nA z(_R@pBjnCEB8kf~XO7-0;{(PQOG?BHWUk(ONGZn1t{P=f#`nH|=@`2Htw=H3f2mPj z6)XgT7yBv8hMqLNI5M5Ch0!QIFh7U_`%H1&^$Vi@4=V znuISPfB0%%2wdPTR=?m1|(2tSUXrz&`9k#_RZTKvSsNpxGD7O^h)4>LWFF^AvmRzW{{hG*m;(}5m?52CqJI1?Q+HIa50;mbMj>plZ>L`zI- z+8x!9*R}a1Fd&`bf&WyXRcj_mD{`CzgsTQ8~Xwz zFe2vO|2RT_enUG`B&JBLx_-limHh2$U=mnA!}++()q9VP;f+chYbcqpo-dml-nKDa z+F&zin3T55_`F_`d2dq2O237$DKh*yGMfy)=im}rtxckG6~NpZ^Ny4*gEVv&Uhr-H z^YO~D8aG9$n8mzR9tbP5bQg?tMpt*HztXa$U`?ujG(t*P#L)zFxz?s{dL4~v8`IxS zW<)urlW|#~qtXsAb{qe6NX@Vhx)s}?kqM2GDyBuFjp*wl7_sxgh-bN)`pRaQ5xyB| z(3cZHDbW;BwmHDu8v}R1qE_!rXn1{w-A-#?b<(<#>-wgZFeNNL^*%$9`))R8r_#X4 zkQwuTY%;O~u;z?69!~->H$vKp`7CT4GEz~V109Qm>5f>nV8$jR{%HSZMX^$U;GI*| z&fRvcz_>yH`vs%xl2OBwL$A~0Gh}RQ^jeN*+)*E7O$)@JnrPfe?uTaNw<4HR3NRmY zXDl90ghi};_QVNIrS;7;>4>?PzP#Z0-z#;0n?#ouBaat)m7RAoGN;o;txU@Gd7m-Y zeQxTMZn*=yQeG7-+w)}R#ynbE+2+3{qa9H);%P(C1hSBZRAJ!|>ER}U*qRR<&Kukr zyLG`RnJCkncIb&?3+h^-v#4^xxO6{IHU$>+%XmW(3!akO6i?PWW2Url&A_s$XvBSg zODRizZY<_E3;1UUk^O25m}A6 zHW4@QBa`>xfy*VPIGDc4j7{bU8S}hUj%2Q9qmKyl1`1?zk7z;8{HW}Xuuz*zevs{k7 z^G5i&g$vH>)uIS6Qn4{-Tm`tZcJePVGaC2R6Kb^JIpX(>(w3xTT;p?wGLhkbo|_YU zrVatSanBa@gXyluV2&pkyL;bCg!c$f_Bdm>z_@Sj%n`YKBgI<-=J4xaM2`{uf_44z z91B8a?KiX9AjG%(g7NWk!W(Ikxt|%bG95+&1>%C*cNLqo&moDVm=3RdG61Um*lj|x}dm!p%*q?haz!^uFb8xu*n)r3>b0AmofKfBNic^nnl=T z;}XpMNZZzBxy2O)11pm0HZVW4mP8Q^4*w~>n9TyWG#8BD`@nHt3*R8RF_!^}pJ@>? zpBon3)5ViVbWF?{FxSRBTQ0GO5l0ha8jLH`7#ba1klpxFZV}TCuj{UVr5GMk&|*ZF zY<-eAA(#>40*PnKBc-hPEqs0h;<6*mCf5#OG${a#WI`bAt+{+XqI)6@LnuvZN=}Wf zKK{aqzi`l*jNC$$iJ@!qEb0QXx75-@z9!lv=Q6WXS&I>ik1vuKiemqtj83{RgmM+^bZfJlp89aohZ8xu0?$mU3}XBdG$2;=8p`ACQ} zvohlB@rv?h7%__MWh_ybO{6IQEJ1$c%_DA9>IA{_ppJFf_+)+qk`r? z#W%shO<4%YNZS$h^wMlXko`3<;ukHo7~<`MXjx)nb~g)cPDQtWI8}(PiTZVH#>EI7 zEjGJ8@MEdEC1W0pY}}LS-m3%VxI2F&9$)bfvmQeNII1xsjG+UzV|Wi_!i+s=afXap zlbCdrk&-{dHf$b)BYs=##D2T`g=pF}GJK>MFmAjdxORm%MkYKqm+^W)gqvppIL%`O zd^n)6_YjS{-c}iZ8A>uLp~{(^FGpDYv=EO>>XZYm=eflPQ;WH7?n zv02Lvyaw)y{0b&+IhXN?>cm;jn1;y2HUb&D)4ylRBx8GFYaK<;F$Q&;XhjYMudc6|vfI5MbCsBwI=SFldlxI(7WsWM-@8|&b zIG^YtH$kIIX0Xf>B>sRu!njhz=30VMdkxc)5&IL5p~+q7kEvBgj9AJ@Ire~>R8^OM zawFvC=5uO8k!SeUAG~^HtcP%jVlRq}XlQxS3b9N(d^taOk z8fv}0vW3jG%fuMs1uSBS9mSmh)|%ATJp3&(#``FY>~{el1&fzOMk<=v?ouS)5twUd zycT`qXOR3mg;O(miLC`?nN1;BcLlM=u@Rp$0G4T}x=y-hws7Yn|cYIo2Oq?629 zA94UQW$j#wHDSb_wt#U|%u>4VCg{=n5znuTng?e(Xu4qcDC)@*uwcp(kY6?Pt?dx(!I6XpJbHe%J&>mDE9GUu*lp|512O^ z&s;G=Yl|-mNtCP|y* z0phgWLI2llH+&|<%-B7Vw!jxYE8}x^i=9AqfET#PTZdzPB@+{1^L2fp95x{qo1RQ8 zjOGB#G~M!&jr5p>;qJ=XN|(4-W^RnEA8?a@!IC6l)n?$|4ObXYfdPEm)xMjI~zmR||s$S*qpkv?5vNyY4}M zU?>n@aS1+>&vv!W%81Vc#uXa@JMpH$Y!Y#GEMOVo zbcbWnGKzNN6seEZ(02@f8N4M;_6rcj(_van>cQq~bRPGNCV-KVfm%w(%uA4~cE`RK zfa_P!(;cy>FeRj+n~_LnlZkpDp`J%l>m%EYD^+Yx)zL%dzHf!$q0<|S%y-6=yK4)C z4}aMCQ~X@TgxZmb(Ivxs1qTsb1&D2NCwg<*73D7-eOm&)O5ufnESXH7P&B+#gA2?0dB||2H-s#BNvYWLmYU%uNeS?JhN3P##8SO6%wZmmbl0LL zez|X5#3=4i4_XkljAAiIM6XL_2%tz0>oE(Li9SE_uB#8oy8&^|)=ezp*hvH9@9gs& zQbxD%)JP~s5KK&eEQftzIA$Xw{FNX~mnxQ0;e~}nk2eXM%mCaO3}t5fESv{kY8ma?)bZ0&`uu}VCmE>F^B^(y%qrPQv--0hPuf`Nw(!v zCrmP3Itt~3ZQ4>xR^(2s>ZY3>2jAi1W-csDF`BVg$N&#Xx?jV=1( zRyu6QJL5x|2+L8Lgo$cnXq_Yd5??|M%>|vouPJkKcCh^rTgDAj!7c|;lTjy-DPGA)X| zbVL#ptutnSw#tkrN*=3__?l~w7pWT@^Dl!N7jv>Kz zOH{+{7HSL$vk;H${5rh6<13U0zjgig!%7E3cJ4|C<1Hi;SDsP4Gjfsf;UeP;hQ;yX zu>}%WN;dQGVEpckmKxK1=0>otVUi>CHTMhGwL_49Jo0zg#t4pL6J0L6dWsie06nY+ zC>E_{v_4`%8F7k)osmA9pgVj3JezWdflbCQIk4DHv+>PJ>!+^{3q(PP&B=sp%tUvH zJiG02%9;$uo3f11c`3j^A^hfJP8=%*9+8vf6A!?}z9<>DoM(DH&w_V`m%`=FK#PFR zkT?W`;-JpaQ2wN-~-ZyKk zC)=ybK_vr?Kf|Qy=@W)Wc}*#?I5_xhvuhlGKkOWr5DaU>xhv`WGPf|B;H%FybxNn~ z$kY%KWA3xc+}^8o1(Sp^Vpo7+I}E|Q`o7{UZCW37Zt*h;*}mRP=GtUnbn#oxk`6}7 zFy>AMKUN}AU@;F?i!MtndwqR&SAPYnuzGo*DkUm=Hdq_oI zH&lqa%fn;6qC$AJt|nw6&fk}($`-t`@n=&n)@AP^4p2KD`Z8IAEx|5@4X*G#eG8f> z?19dYD`;7^VIsw03iP%lr4)(RCGI?WwqQ&1F~vz8U|N-VcNtL(Oma=pE#r)IsTndc z{WkyB$NDKVH@*`6G(|F@GCih$D}E(9rmMzvI+!D^2L>Mju_p*ohqk`T&Ne>{ozi7_ zYglz>Vd&~2o%u&v723#kg|XVC#l;!~mgTZleeyiQK%-)vz(=5U+@OVWYp)DQy+!XmNGohQ( z1XzqkA{3y{^liTdwRuCGqs~vgNv~lsK1D`!qR*;^WOQUO9mcdX%?OmHVM94f#C(sh zQ%k*!YDA80f~3qWj67C=e89z&5B^JHwS z@Kx*BoFbz&LPo~wtCAYthqG@%vEGd z)vZV(nSIBmaHE`403j9#K7%b;U@L~ojJiKgMl^vRt=<{w_s9Zi+q94LT~7$(rws!y z4e(X4s4YH!PCbVrnX<~Ktz800Co}`H-C=~^Fb0RiGQEv$dIO_9#}wyfV1hde7Spon z7WIN^6t^^A!UK`94G+bZ6APED(fH+1?miGvKu`VzQB>JEZAA`DL?UC1bfa&RRSzXt zKV!^3=xa*nG?Y+iTHkyNhEjxqN=UC~^}0Nm5+x&lmy~1bAtE3Ihv(!x@}qbrC6+?0O_GhI1!NcP$PUXXIf(U1#2zYMp#R$SK;J=!Ds+$4DQf7kUIgh-U# z9RIv^WZATyAG8*k8qszcX@8!A&%9uN5DRF3c2CwC(;gUY-wM;7I;pkvE)G1LE;ACD zm|@6-SNNM;Z(0})=2Xf4!V#DvFY5{s6^YnvZ@jHm!oFl8R6|B<03$Ny0!Xut>~Dd% zrJ^khmR}JuM%w~4k>S9Ce6W9c6R^EQZ4iUae~w$l_|ptEsg;bP88w*Rcu{j39XPCi zp$1^0)n>fOMK_`ehzd>X&V-_RI-*g1T}a8WgzBt1W3$bQfbd3b*$@5TWQvVLOcbpi zWFR9q^>1WqNQ8_SU6hF%zm)?GAheY1wIUiK_I2C*1H?bXJ8oIsh<#;c4xl{uw7k34 zvRBQ}h_rYM$FkxMnERxyDU;+l;+N*Hw|s^}ornZTC5& z$lY3|imBK(s3vcd%pdTsB9x-0DyK^+tgfzo3vP5yfr{RQ)Lsr(#nu%BGp5Jw$(V;t z6vjcD)y;4wW|b`@;xcxl&k+?QBhFG37MqTYPpeb+oQc9#Y7B!6L1GCpU7K2eOtgj& zNX*?+EINwEBs;VHMy#Ezo7HV*hk{t^tjA>9-NI~H;Eta%V0YTEZg~5aAs%3-UvCr6*XXy@q-g4Buta6$XqfiFaP8KX^(L z+)lF;ugmoE(2TaA6p2&Xi{)5<+GotMGt$1Lj&Twd#3gOSx-7i}<83ho(n#f{o~fz_4GN_d&)R5A!e~S;aLn zv4D0n1^gRg659Svml)fS3evjEf0%`oQI8(Dj9e`_T@BzX&Q-Po8{-x-WHpjOMpj2K zzK&kH^GBr0^=7Ybq|?<4hNW+*F(zYkk;y~_W79E&B}9wKG)1Be7L<^wZxo*d1f~>( zBV;lKBW@tV5!bBDxiQc==8$IP8P}ly^a=3;@uVQm&z@%_+d_M1tSv(he+-YQRYqNg zVq1huj-_Z_u8=LaQi8=eq-RgILx7KjWJws$b^$Q&y_Jy#3e4CTSvXdtLrmMe5a&3E zrHV~znh4*V2eHJ+Z*_ZOJDx=bD#4>!ElEp>b<#6J?d0UH*c#KhQMA^V%|mLvDt|A# zgdki2`(`$70U0u4#vuG6f5XcVjg(`I*ls;V#};(8S!pT?yGW7Teqct+(oy-W7E!OK z6YLXGs+u4qPYKX~khKiq6deex@|z59F$P$q9n@__vU>0l7hbX>YqCA$;-wvV<8phf zh0NTUsB(LBg^UqvX@^yX-xi}-Of74_J11VBd-W#uMk*fqjR$<&oplWxzk}G4Y_zm$US=&H|5+M8A|L7 z>fBW5-27%nJftUAf8Fmr)nz`j*?Eq%m@ot_|jj4CP#I$e_xy z!Q>1!r9vV~SRtTjVvXMw{(u8Azp)$#xRfMD$||I#6aA6Tujf71hFB+pp6vvRC|Vumj_LgX1^s|Mn)Fyo^@?OF+g>5 zeG{$21V%P}D6{2KBRDxn;l|jS!gFU~j785lj zq}(uC0i+c}tm6JM<|6}Gj#D~wN;7A@u^Ab9DkGZ7Tyi0@^-4nS5=cmI)AI$6Z>d>dW6jxQK)k>gHJU&45rj-<$-|9>&&w;J_L+BNrAW# zLhl*Diow3}nMo2)T*NEi99KRx{6o-;jUvh!cW1OEunVLmxIfw^BTT7!_}a>tlsB{3 zyUxfx%&67IjE#Av4O9JwAFMV5;#QI$e_AE^pSp07k+#0s8F0pz$g5Zeqot*3v}8w& zY#oeky^mWn2nK_t*`( zHO)AZbOFpI8S3oCc$AkibNJ2~nThaF%qYZJ2_35xV+t$-Q)aVKmiiiFaz?czf5qQF zrzF`*v!%OyZYE}SVr=1Q={)-{XY`Juj4&`fqP2AUqP2MKfh_!FqMV*hl-^`vmD76t z<>9-y)_vQd;`G{?*X$+Qg zUT?mI&9T}@Jtnz6(y;fD=Fnbde_~>3$;c~LeN-qI$usja13yd-29WUe8R;@4bu!WE2mhF-EQ}Lql9t}Qd`fiNmg83_z^|~R=k1B04 zM_fevNRk+*M)c@9B&3kD?mFWWNty`^FEt+#Qlw@Z(m6s|TFsCn-x5c*fA5bWxolV? zW4+TEy&8hjNFZI9YHc3XxWtn`)J3FAoiqy)a`C6$yhqtRbtdwZ{rfLAr6#n_b}Mcr zCV1Jtat1ofsFgSZn8v)ow9^{taYfE;Dm?RsDhXQKB}P?Un6D!zL`HnKp*zI@1Kjckv=!`d}LRY|JgC z8l$kZCZxN^=b4ZVje>u@8)2GmTGOmM^ zkZO%NCC}Jl^PiVwEgdjzin7a(nn=Zxll{LcpVlvnx^>mHeDK$ z)fnx9X^>tfV?t|yV?L8F0~?V2IR8e{CRT=qjI5eq#2sl>%ijFCB*(IqiBAQ`WN8FE zTYNj1Q){alM@FlJf5u4_(4dVub{R3cNA7Jl2pZo#2tiFLHzt`&3(M;=0!uMWScePl zQs!Mu79+anuyn5=c_OxctOaXeO8Mo4ZGQszv}i8Xh@C1jm~M!8=a@S+M48DHiF=cX zji2YIaK0tmfX~`9zP9>-wQ$@8%WMfI_7olq7Y&(Iydk%aREVCkB5ZB=`yHGjlw!5(F)P!%4}Ioc^?r0GX#w$V_}ovD`j9=7L_nt5McdXVjW}}a zV@Dyq(o}Taf6`)@km-`e%$ZShy&}`AIm0g@p%rUJj7BXO9_WLQ086TxV0got%7c+M zopm_*Wnjq#!>}m|FZbb>gQ>2RmtJL4@h-i9;WrYJewd<)lHfgS+6E}2^kYqmuZY}v zFqh`JeQ-msbf&w```jY%(`_e@#9iewuZxS#h_fbg_DE(&}PQ zn<~i&Kqh=9lHW3ufte}&mh`3M_k1dYIg9BrGC#u?U-~e3 zXDC*=1$%BRzCgc8rw$kSrAm@&ICh+$wKm?ec7mX48I-GN5uF=1CXifrFf#L4H0PGZ z#+d1I4<)1)FjDULK5CMntS&26Mx_dWgEFTIe=J6pL@*vvNQ_AeYqqKu)|s7)v548`Hd$ZA^I2&cygG z8|)V6!iaMtq?);rJRS!t)6pKFHf7s;!a_bLRZ2X_wpVQ~})9>KLtJoR?xh7;{ z48h2J-Z8_odf+=F>&kMNZ`msBrb%&=Sup95)R zJ!cG@G0oSv&-@Atb$qlyK6e}!N0E~yIF9T_ICGjCHiPxQv9$e3qRRFtT;x zGPB6MO*+5!5JV*x@w%cLY*LMBQj^9%wnO7tAd&GSI&HzN=aq&TfAgG0=4~=&$R*}# zOB+KUEU9XCF9mzB!~^*nW)ZC=Q`WarFr40PEKnT?f_)JLd95CVG-|&1zgXtZ&%3Q)&$RsWb2x-1WQA7e^l8p(! zgv@M;hBWrlK~siGe@2WFMi%~BBu$j4j)}@3&^1;x+LkW8fphFFfg>#S*?vnCX8FR8 z41jIGNIkXzeIR-$+EQWZZaJ%JD-)Pt7U2y;KM|wiVpJf9*_oZTEyzc1NjT#>fKR z)VGfB{W)b}mM!R-Y>8gF)zk51aAjP{NcggM!!heo3YcSKqOZ4kV`4>{Her6ap-Oky z%V5xP7l;BVf8e8MX^{nRo>kzCLWVk51~DI7QVfjyW(mfyfVe7gMD_GoVw}LVxLlOE zHpUA67Mug25S!zEITH&sB;Z~A%nFZd%m-xA_#kdYv!frG8jl(Rxy}82Fh>D3$+3)& zJ_6j27JT6MzQXpV>JN(B^Fg@lOOR#QqAsx_XWq(0Wb8Jt zTg?$Lz7kLZ=%Z(sB8`yd9?9MTjLT~qRI^uRyi$hA_#%qfTvIfjoaVAa!zl~O9k5bE zC$1VlA@gVnW)`A&GYb9EU7L|eiJUIwEt64nf5-@yZzmeAgj~;oeG1Dyh%l-!kdZ+s zxqcRxZw8=){tGZX>q$q}$B9haWa3g!I;m*=q+`2DbSb5}x)YA=86u0gpG=5@35iEq zYo04t24Y(Q9Z9>)<{r`tSmALUKd%(C^ZFSI{R4F&gNG`vH<{3Zh7h?FkFbcyx;tO0>at(fUFh` zM=?T|!T2oRxOpPzjf$40V4iK*G517lwv7aP*!qpzyKZ}unQqCE@xagBzinOEEZ=Xj zhF8+-<#!m}ZDTO|I&{;u(+H0;!GyU_e+F|(H=8{6TS0^`0pjpZbvSrobdx!woABt4 zD2AaFUK8m3iD!{MHsotmDjT%0OD;1aYY+Jgal(G-VhK+hNq`r zB`W94`FJg4kY$BTqGKy6@+R1$e^(5Fv;<{bz+72??M1-kipGGE29QA(n~Qr~DooC( zfT7Eg;1%L;4iPya1H#*p>a_xFQN)6?K)*&FY&$$RhQO~Yqi6TV%#C?Q&Jxu^eZ1Ku z&O&%(aC(TXCHO>{Wc&g%qV{-iK-{B>ygL)ctcJJ}E_i47`e=`m^{*7Ie+(k}1?G;i znA-@?dPkD+`QJP|nV3n;@oy$S7*1LRQ70H)LqJg-Dq|E`mjY*I+hp8aZf=a&Z(sK9 z9N~BOgsc&L7jc^xx)!%NnYb$vg^SRWorjdTCWu=sW0R09wj5ym7?c}Zx)fo|Ew$JJ za!aYkgct3MkHOH`pL#U5f85X?4ljpHWC9~j4E$doY5K>}4tmJZ*2~TsMt6*e6SWg= zGq2564ku3d#6H^q&pYEs+KC)C>hO_6-mvy7J)W{)9A&rEnNqcX<`SPxQ5!j}N{dTp zlkVkn1F_U^ZgZ=QJgYIyZx#=95m$_vJxm~jj;B;MMzonS=vsYBe}&AmF|pw@f85F| z_L&xRCH=siMTd%hLv`UI0)Litxcl;nF47oPo_k$9CMZNrmPRb~M;d+I#!z&VhM2 zy7e)51jA?6!81`le{GWSV{LPO^Y!aX&}m!*I9V{CvGIdP)~UGSEw)< zzgs^C{|X!MgCkT8zWfNw4b1Gp*hP)ym_%r}Iqx&PIrM| zY!aB)&O}qde@I1Sd@}j`{u$=}f@e;34;h;R(|4rEjL>=GF%YozB(Eual$|2Ang93sbeW3k7nq%4gBHJT=K8K&M(qrxc)8ER7^>^aHU1j8a+ZS9y z(0ctmr99i-B2k{P^3XXEX5r&uAiuu9m!WiOgLYdC`^U3g&GU%Io1q`lxjue|TSveP&_slLc%NQy(eK7+yPmqCg~! ziF*Oe)vJuW_iNZ&X1W)NPi1TROLap4%WUC46O&mT#(cFCu0xEa0iZP)o^VDyHRb zf2xZ2&omz>NQm{>css41GFN_3e7C0GbM2E~LD-m-#qRN#zv^eJoq0AHnf2`Z29FfH z2)Hrn>jyv3rbG8ifiEfU#84{I>M#**%#^|L_r0#4;>9<4Q@a5fBAfIixlEK~bjXlL z7*3RmWT%5)yB5YKO0V|TyBaV&l;p$Me;UJYzWMGMnQ-O5W52qJL3WZ}!pF@@1;jTu!!nz~f#k}QjeIu;yFe}(1Z z*lc!5i=S-(jTusf>0CTqLPji&TfaPL&@Gyk_NFwkY51+_E@jy`jf^6Psn{3^am;|l zOyHNOr3RVE2t2>dYtdPxO9wD@#R%QW78K_8Qi1Kl;G+Z2P~=7*vGmwqi@1J#jl^dNrqlsOnw93x zk9k@)j+?$edBK^X+-CR)!PuBfj9h4<$Z&d8#jpx zQ;U;gi^{nSHSUxx=mzXci|pp<~y;ybRcls~rRr00%np~YU%Ir)u zlrQpcm62Sf5Ge~Z7@c!E^?ua>gnRU)Rpkbuzr-ha-u4Bb45h_*^S`Wk{5rr>nMW8bvoUsLT4f?`XOG-b2Mx$1j(7WuyAI~w zm{)4Ks?QHb7HG<#;^8at_fwXdk-mIkf|_bNxHHn4>}xodUY7N;e}0kLnR{cjN4BU+ zv1aT^<4rZa8dFRu6Q-Z^2FxZSiyS`@AnHVyL{Zu*NGQ6BPf3T)}grf7DHR`8{Z9Z`$X>x1S}0>6|npPj+})zGx{w1ucDoj8qCniiM7e z49q)MflUjKwn5SC^@ZpWf-z8dp}sgI$F@R)Ifa2K*DE9UPW?J`|m48JYb?HD=NaSzoMcG9P+c_C${kwNu5leQiCxuo_zPdv;ym` zH-xHf$h5E}K!r9!tio%HZh*mJ&Gf@N3Y|vzSJ~uue@42by7|4O*NYyBjmhA`H=Lt~ zb=#TDgY58>rBe9Dy)ZIgUih$cTyP_%*J@DG;d01W<*AYQk%k}-(qHlO95qGanYHYI ze9+gImYwVMiRjzYs;AtxZJ8}VGWgNwjgjTUgCB;fbKL5lAR-}B?OBbOR+d^|v9=iA z7>Z&be_$Cp4yUE%rLO7jnnyAei4E6O!CYDzwe9bD+#`l#)-6`bNTW>2q~M};AY_Hc zccVq(soozLHy?nt5b9;LcH0`v{)jCl=2vz+V(={{<}>nnl)npO`?e1K^vU;$6CS&B z=ns6@_Z|M^DG+7)&OBbGor>|}mn3G}L}nDTf6m3=`Box77ewNW66{#aIM2ddendZ* z$Yp0`E*T*({=C(9NVdna`k~X0I9)hzdHR`5XZ+yQg#(wTA8~WWpTr>(Z#KDb$Z{iM zr1?sfH$=dUs0mCAEY4K+%X`EJH2kX1^d>xm-1EI~h%z1na;AvLGi8^Bf#mQ$nc=N4 ze~cM-O_*;u5g?)lJAn&er*CETHs{n>h zEo-?k^5`yQWW}-|&po9aV@_!R7|HcDN1mGnfz{iBHW|&B^)3t4%(*eU%qdKISJ8rE zimg;>;FqfK>o*?CC+am_4z*tR0D$NYf0$Rs#h59%)-it_%tge0D+pI9d=#K!(JFox zz$I`Z7p8I34;g$=9wNB#LFh*X79&Id@ECu{;9$Pk@Hm(+CELM#DP|F(H2BW*C3RP4 zhYa)?UWs}Nda#CQxXmtJj4ej+iX-k%MjA>Vn0G00v>Xf%U0wKSod_5qW!jQ#f6YAV z)-;*emvaU=u&zoCZ`ts==q|@_o@uMk;Hgmkp;J8-_{ZXa(PL(p>G@`?U513XN6aH_ zFpoGi3;wc5z}tv^;$wAM6V#^4NPn(vY~T?eSpx3h=MNv!i1by?1-lmwf41NlD5T3s zk8N=45vz-lJTDdgZ!dY$^)(lFe*{Q_WM^b55kvHptp_ri1&k@>xhW+XO&1lZdp_6t zO7~PKAHlTLfuDcnP$(GLhNeu*N zk)C14f|35iARP&+<=g&b1dVX|vnlpTwLfuIO9`)F;9S2r0boXyLYey?XIkdzoKGh1 z77}z&qF6AJ2}~HH*{!kFrKJ-!-|9janVkX_D}@rFsANPY9p?gs3qtQV?kYbZsEE?= zj72(cRA0qAzV!It0%C%-e~}wrBgJIGohS1|@nxI(;%PsZ*tTJKLJ;ZZ{>FXS(oqIN zyX`l}m(05{+E2`DUL-bNBu{aC`<3Ht3!)7xMFs!LCmG1dI8tULBxPXVg$?A_v181( zklTd_n`belnl)V-k+fN6?uY2{lEsh|0r;ew$hmWm5=;t*j>1Z0M0 z_$vqZ&+Rbc`E(sBM^Q#yzE2!Jti&?}OmC*1UL_hitw)Eme>5gWX{;U^BYLEN}*m}7}js8w(LiP(2mJbM5cOqbtjt4{Z{6c68BtKqNU}p91;1) z>2b>He3J{kptp0SDTo#QeCwkm&S+tO#W}q5#%CryC< zZH!-B1nXpWe|hWjOlC-9lYzG2Da{(Xz?^SA`9t?wmB204xwB?T`GpYZaK7vrk~QmMf9r>&`=&h6nSW{ z3?pQG=%KL{OAcu4@egvWr=((hKj_*%(|IvVn<8rJ978}RY6l}XEgq7(hN2@OQ3-o4 z${TM`e-v$&Gh-*7fr=ZH%;6n|wic{8pmop2csn-Toq4XBdVfqejqRt3ncjK1z?;OB zF4qHKWaN&WJj_@bSr+UGDY54G$dmvvvt~W2NM=Y0Skha{;lr?5i+s9jW5n>-bA1m{ zsX3h&@&(02ttY(6c(d+pw%i`eI{6rtl+x24f5>^~l^akReN_8AS&~57@ap-Td^SoN zvDuH533a(gE+lOTEr`pNT^Cztj^srD3MOJ|WW*Y{#K z^q9_4x|k9cI60euLrTXiR>fryHcRoWhyPvXs=0J1Fnfs%7#|I+wNcZRSJX?j>`Ldh z&ud#u`TSI5uz{5FOr3n?0hUD@%(XL8fAdj>&GG(lo5U-WWZoc=Bl~>D*h*7|Ns^Vl;fuPe~I--rrddTaEbXHfLILzl8-6e-s=t z{pF0rGVNVRa+Vu}g--z@+)8n(eybs8GI0vt8RWRi`C&3m+JvCA*P=n`@1wG*z29jH z$%}K=FdZ;u%uo&HBN7wc=LkHzF?ZP2{Gl+0=!YK%h)1v zEMxbk@cs85HxFeSh}<9SNifRUf1YMKx8MpG9ANew(Is5p+6X1iE#k) zqEwq8IVumPzi6OMkdhtGt{6B=M1agItptM#t`ZSAJftGX*B0U?LpCBNU_k2fhgl9h z6V;^USi7Zj1M7~VDTkSWQqL{DdEFLZ5#V|47+5F|V=2-LEZSFR+V=S7YPaNSK3c4m#xtqKQffkGB_K087TmQ zKoP>j5*iOZZHN|`f2YOv#A%WAI5!R%n-Pl`apY37Fl#A)+Fmf8p_II<@RrD%Ld2R4 z@iKY|QE@`HjhHIMEkN1`36p+cv9a?=KVT?IO_DWpmT1P8XnDf+8-X%| z7a@lmf0b20O+l||b+VKVu3g8}@hY1UqJ&z!X=0`NfQ~p9e`7@?lMP)oH6t=14^FmT zDfXD8oE8)lNXfBYlbk{8#XE6kWDKQjmS?IzQo44e%$|1Rh@8SB`&yH@Vw$`kyjfx> zC9mkn!5X+}IyCak^Gmv&qT$+zNQ&;u{vCX;N^)eMBN1&_js`NsO3AToMC7Tyt{Jg$ z&JY5$QaQ3`e@Qv>w(lDT{}HnD;%LdYz6W~n^$emD_%$>5d| zi^veAOy8d)yiBKCY-gOp;f2wvwmI2+E<&lLfpnSqmXF0-lY%gqZUaW|iWdoa%ZN_g zr$&5}(q?a#CJ>n-t`Jl)Nw<70Y_idBB6f3*oNSwKf2Gm4BF1rCCmDy73&rmy`w|!7 z*u;g1^drYVwk!Mfh;-}jru?sDFkCLxm$-yl^t`0S%hEB;rS5BzSpjT8Xh2jix6Qub z+DURjIy0g&-z4IP#1KN{kjG^t^ES`Xry~vBEZd$i+hn?}t&@J(BQD1;R)ofehB#Z!?Y00xM^7J83QVnJ@=|>I^Yug=n zKgp%H*u8{UhLe=cJmaDaYcTJGs8vj44JXdIe`tEm?;=me^u*&UTbzw4N?ajLo4xkE zJ@b)`dmzUj$)h{pq_hs~ly8VFNqV^0dy&$DaG%K}Sr=B`MX8W;rOOiqj}*5iz*dA( zQvm7S+qH2nm1H3X$C-d40QS-4v2Jr>&%5tfcZ9aZvkta0IZ_^f8n14VyS2YS%H%Us zf4vIcHbDs@-6AcoEIGUpWs~CV;_b$zS4oHt3A{emlyE2lsrH;U9}f{cX;AVa(Z};- zq)O+K-S|3on*9s|7njj=@OZ|&>;s23c+<_>ecR-zJCBr{*Yp6SvC!}iKpsa%t_=}0 zm1k|FoJTj|EPYb*Iy*kD8ka3K>iZg3f7Cp5b6Mu4$6BOC$?}km6uBvS9?Y>)w{=U6 zD{A%WGIJUYIWf)zktjE^P|Ss`v79Lwe7TSF+(BBg{7`Pg`vW<%J8d_bYmHDd#d zwX@WC=H*@uCPF?~13*M=yDyK3%`v1=Vh#*5BbM$EY0L(f9X}gbuJ@Hg+8fUZYi6D>w%ZV5~tFkqm-!HdS~TJ z?VyaK! zmg@W|Z|h7^QWnonSk>e=tlqyyJEWcY=j`+x*eAxqAkuL9d%^ek%$c# z{V-B411KFCv8zKvG^_e#>gH!5a%_m(U_Z-sZo_$|(=g2Idu{4=lBTA!GsYopeA24W5P1|&o*^zdfjtRROfy9cVW@Di zYcYuqrLH}Pn97(W#g5&kR(`Tb?BSXM11rwXWI*$zKqD?nWVVP4m!*W_s_4rR-&Hom zYj0sQwa%r}ke`y0_JS+DH9o3D_)Kz~n;|gcdHzPy^Q@;gf0==h>1Mmy%n&IOOYc3G z)Ur);K;+@l!^6%UQC%N$iNz$O2}k%OQRV3xA6%ZmvHTFWNVS+M;!F;II7b$$#4acyU}%y4>P~0Tu%D+g z{)j>DMC4Hsk@7affUY4I0$xilNLKPCoW5YXbSk;zD?ilg;=0{TUbm04R=cY_BOH>R zBDiXae+!kDJTx^ghzd_r{4pL(z)}vj<)t?ZX*MD&KuxktKz7B7NMD6(M-&l|8q(Lv z%L=!S?DGK;+X%?9@wjuXzFr6$i9j)OCjY--T8yr4p52&1q4Li7XWGsNxe=vPY zPb*6J<5)ly_Cp5;lsyU1vcM&W6p7Wl^mZY#e@{ssLDUj>iRM53OlO6c=dcDr~O}uzbx`B1N5c2$Sghv{N*~=ORA-gljnK*13<}n``w#$r+Geeby2UIP zf4g>T6O+ZPO%b7ysV(`Gp?STRsm%@-cz=Z zv=R}GNl#D-IZ#L1JOwZ`)zw|G54d`ha+qehqOECki}Wp}KJi(8rrr`Nxx?X%Vy+%x zNbB>fiVG;xA^$=oPh2jMK1xWHDzB(t2n->5AY=?T8I=ArfPf^8Su+OGcslW9&zFt3(bkoyK8-e@{j#Y;otU zz=`8yo836&%myYAJkafAjin2+NiH2b(vqHMfiph!Gpgn2##yAaF*?FYi(R*IL{~X! zncvT(r{TsChOBMj%#p{rIAmn*wC77iR1py=2AWiAf&Kh;JJ zi=RT*jxzj+j@^Hl$Hwjof72{oJ;Dz}Z1uI{E|p|;3l6Iy>gQMYw4gq}9FcL`Zi%*B zl#JJNBadg2l7IO9fu(VstQ3YBR5f1c&K7Bz41hGLY%Q6ktrPI|BRPf;Vm&qP*?0lE zi$khy>0$@LadYg*$O!DZ*Iy&j{E~DdPoiqtGC+Dptf-al*%$4Ne}V7DOcKyCFB372 zwOu2PXz9I%r^ci6OSoE%6nAtAd@@I-rIk7Qq8$F%jwt8TpChe1cBuy z<>a^uB4UCtmmq6KlS~V+u3m9pwa^74&Bc1d#{bSMza#sv4UvXCai!PeEY?F*+9U@V ze`siUNjImFc6YvUe;~c)1={A0F~pn8OVEVS5@1s<0LI{M&*TNJ|_t-IPsVm#B^BM{FoHMH(M; zZ{fPun~L;PO3FJ4beTx5g@_`c>qW|0qFXZ{r7X2|!7RwRT|MgZa|?TeFCjk2lkmr^&iZC|qS3exrp9Vk18l^Qo(2=ok`%8tnc zzLG0Ym_O?#Pdri+(oZo>3mCM;ul+}Nzi*Gc5u z5YY!XdLzZO^qTUbG;7_FH3&JL4UwAD7T!mTz|x_pd^uvK{sZ%avxL!jnVjaxJeSXe z^S6|xn)AUD+wBWOOg0S}Tdv{ttw-wXKtrq*oth`*^UkAYKRDMf z^jPxcnU2Wi^%C)1lrOIX2TK6cpsFYJV45Z_&aPot`UN?zElm=dVePF^EqVDbQtKv=X1`PD>vuF5h&LOK&rQ@ zh5azl-VdZFet)~Ecgu#@4DrjiV;XXHs&$d}WDeSKKS4MWhTI!sQgP6>!@ALElYHm6 zB8RP`588u82z!qVC=S5rlSW{>W@Mg2f0`~^%|_WE=k)oFK~HQ2DsKH8F-1B{W6)ch z%|l0|5UeUVh%IafdU~cowXnNIp!ondtVq03jP1&Z_8B}@DQrUNZ1)Y*W9=zRBUH~X z@{ksBuja5VW@#Okxi%c);5}@EIZ(YQrTto}(~62aG6YyyTA~^P*<`wO>xtoOe}+^W zwnu|KJcqw{?{2d7^(C4T^3;yBSarm!2V&KcULA<12#l5v9W}1r4sI;_lf@|ltD)Ii z?ck>J2vnB_ANk!S;*X3Q&yuVAGR`P1bp**hRM{?43rn#rhKSUVXU`=gjhRl$36hBq zc@!b4Lg65|mGn5kkM)~FbX-5y?}+sJUl ztyx3vJ%AeGc5%qxiZAdkV62@FC`3#msq5hHiD%X zKHGk9pZd1CAfJ+7LRgJ@f26tN`RmEkQ!nz4FC_;Ik01_z2ucnBc%5& zhxMz+C?rRumLAWiVL2jM^!dEng(-fy~U6YV0F9qAQhv%ZDc}Ho!4%>Z4W|Vo+`XQZqqZt7QU*3?w6`m8#E{E@eV1+XzXFv{6lJK>EgSjhb81OrCqyK7=z($)$9gasLRx z>V_QN;5#j13=u5fLef1GXWyI{*Ow#OG z-{)^4eh>(_bTF)I`nERG(4Y?$eS!wqfUa3uvfpuI#E^4Gq)|^^Ja(>jloH)GG}e2O zqEbf*%SWC$P=+7jFq$FvmJ9X+P98)`lr}&3;cwMCe|PXmn|(itgcgt@xeeKQL<#c@ zLeGe4d49b^25X1~GfyED`>7*>mCc5X4bfbiRmmHpC^IA3l_LgC5D-1cyP%3vkYJ`+ zX%IkpjtpN^%BJi5QIC&-S){RN-1|8-cJ?KIgs3}1P#M3*A%)lc!kwGCj$iCBT8-@` zNn%>Ze|>NQ@*2i(sT-|Xj<_MgbxBcbzL2lx;bpuhf+h@sFxBX%G++oJwgPYGW%KyW z#S$n>?HU_sw2Uedq^HW<%Bax}s?q3ROb~}8#|RlBW*z-RMX8^qdl}%d-niF@glSK> ze?&15k-p#A5+jfF4Esw~=aV%UIaV`XZ;&Xbf0s1XZ$2cj@n=?8Z8LD`F!GktK_omW zV%&LLw%`}?#uE@i^duZWGKfTqQpcVyRd)4;7_GIW0Lu?DVyjb|QzKnSd5%GbKpaO# z$pfeJNGc0rY3`&&c|-;Y?K}29y=5U{+-QA@cif~i#NMQQNWl=i@kg9@!yQvdW%c=U zf9{6#qLgSPx`M0(%w=N#rT~q-RZv{P7A}lLa7zNg0t^t`9R?r5-~kd`g1fs8B*@?l z3~m8tAOr~RmY{>fAi)VP!6CR@&aJvH|9SY&e%ZTLf4v^McGc?c^{w^Q5u+_*g>|EetZYaYYT#820jZK-5Qr-Y@Jex#>b&hDR%Yza^CTgmM1X?1 zaLqgJ=djq|S~lr{^-b};KjINko(q>SJVJ(r?v^G5)d-{*lX>+VzR@Y)c<5+D1`$KP zb%YnuB>SIH1txX{qgR_mG)Q3rh?^hiVHH1S#kd<(Jorv!15ZV303&y3#ZW^;dYBa{ zN9h8bqua|;{-tTPob`Ms*wcd668x|9Hu2hbhf)6$byW03IJnTort0p-~o18tte7^(P7g0nZ)kmmFZW`cr1 zO-s^I=CH=Ps})~953h(@eg9$XSGue!0~V1UrQ3jPNCyX2iT?=e|B7-VYZLAOq+2t_F&YKVg^4n~}uclqLZ0Uc66-RutM@jsgLefJl_TLiV+cFqiMz%9U ztX_{aoZ_4?+4Pq)1m_+gz1xaE!6b{K*T*_Oz~#n+0vNUx%<24oEWeB>uWsvX|!V&ju6Q8OHVy zGq}OCh$qVIVen?o*mW$7uR`31EbL#$w{K<2aOYp%CIe@lrbKuJdGuL7#~9~-$NA@< zDe(>4i#`Z+f-z8IV+7~IGAa^Vu^hozFd4%p|yRoBzzWeX9byI`>F-CbP#DZeXNaF*rZiV39k|vDGq#bdTj%a z4e*pP=%+QspPynLSu4Lu|Dc1rw3#Wk{;<5!>(SF3-%dyK)bNv|dFhuBeIeFw`9hE3IXNr8+f(kf87bR&YK zMnZfMEDVK^mlF)0VK0#g7^r(_PSr0rYbT@F1^T*MaavN*U3z&}swqK@JhV}^B}2S* z5|{bOygw~I+=A9L<}A$_My5{CQo;IVB#X6rm*&z6nyXtSiclC1Rwg)ka^{IAx^U8@&?$8SHVQlgu59KwW zGWrtnxG(i|m(L9$ei8C7qV{#9qbCHvB)A!MsirrVLrxzL{_&%?U_z&K4nM|o$F4z8 zL}0fUIsOktV{8x^b$xtN*qF?n#KP4|STbG6u{TC4%Ksh-m6%J9u1V%o~%OtErf-b7lMv_$IuY~ z{8cPfcRIp`heWp8;Y5bG=EA;JTc9f28rNT04WAOL<|z-jt86Ee9ShCz(Z;U{xIzgj zD`ZS@#k*xIjnKF7I&}#NdFREDbf)>-73@;oN_zalySIi>%e8ulaJ<=HEATLYiN6WF z6MH}sI@!AO^f@549`voQyyM&1A z?Tol=`Y^araYCTOeLkTWm{iQqjax=ZTIWzT7VfL^=-r|kF=@Bd=>l2mMYe7th~U8k9IDE1N3?^YnDoiK zX(&kRsbYWdC;8O-`ARo!gyN;{`j~ZwZ6RAn97WFGveBk9aWr~%GBR5z_BGIxuu$}u zz7vS7t^L%W*l?u`siDGL0UORlpj05tVqg9ma2)v6avL@b=b1Z&X{W|as>^|+wE*6p zN`o>;sQVVoh%X{7L{+Kv)`fIF*2@Wih~$ud*{vXc0!pT=J-hW%Ag*TMh}0I;Rn zxaW#$VKGMtlknL%7zmM>QL;I9PMj)tXUkQP{W8&8;lqK*TW-gzxmKBOdbtG*eedMj zrcpZxzDlRb>OmRTP0{r}QxWf;$wPTBs}Az@(OEtblYUnzLrihA=Ozr=T-%SJ0-Ow- zoKxEQ&J5j+=^8L#C2FPNkMl2R!p2y*m=Qne6nQh}&wLR6ZiA~2NJcHh0VFA@0lG82P`APs*SMO?8en$d{{F zJ^%1GOMI*7+u2LtQnXL0c7!?neJ5+avZLd`&jd))^JE~ey|!K?451KHB$fNZDW`IjEWdC|k^>Rtmv!Hu zR~meOPX^gKR4Qi`ZBsrw|Jkx_dv%3f_b5q_zXVO9kO~*Dd}j%G2dXRyGKmdVFxZ2# z&u2rDN%lW@HJ4>+{=^@->&K>qFpXN1AI*6T)_B+gnU(wy;NKsHgDfp#pafXL`{mK{ zaXh(BaH<>OSX#c4bJsJ_dL-3KaXRh_XkEp+AHWa)T(tTs9i2EF^3=WOvEg>S;u!%d z#AU?&Sqi;cvhvQl#H;~T$Xz)FUB`nol?;taQe$KME=O9o4Y znENtlYCv-%7HioJjfP7BPa+9e3cdNwPoLV3>v1`9)jQo}Q8=7L(I{{|kPT$onM0`3 zT4hy0oF7^3*$};-@>*jvsEU^OACEtt_2h)IhDsGIMu+P^m|SgsR(qscTtGkc18iue z;9;Xw8&c)XSN^+_*^)y6LgH@hi`>(qyKeo7^+TKq^lm$H&E!a;l7Fi2w1=HvV<_x` zOY<^2C>(H@heQ#RHq<41znI)nFCfE9m)9=?L=$XJlrF=x_Lu%$*yt4{I!8skKlZ3z zQU~a0tFeER(mx<~H6T=UfBhN_P#kf)1|NwQy2;EhWvq?RB>bkL5<25=AHa^E2C$pa zMTP^>Z|PH?N9$hWf=)QsVJzZ3f7#@G>6YmJo~EU~z01(5Z!cF@KHn(9L;* z*2$?Hx10&-+5YQ}u+gKJHNZ5zMJ{w2Is94euVMF?9(=PGD*g-_!zgB;_I>LvbG(>w zj2`8uHah#c^-(D?z<$xr77(Abv~(ROL0AJwe#6!~bz7Ni8IH^PYGC@JRCyX;V_bV_ zCD{Ca|3%&T0>$c9P+Z?q1%&h|sUdRoANcsZDi7(df!4%Cuq zmmjdq_JVdJP_M%(db!bpd*b%C(u+D3p7oB<8EemRJv+gTG6+zY)h`vO6i{8zhPFp^ z);(sGt>=bhnhh=Kt1S|sU``V4)d^DVy<(izSE;Qr@blQ(8s+W^xwq)2znZ<}BM9tF zZm1GEv~_0&-s)>ZnpJ84B=VBpGPBu8V^fxRJ@WD58nD{% zi#M=Ln0D#dU5@UAt5=W0;JM~!|Hd7^uzjRb^v}~5PmEtrQ-uUs%XodQZ2n3OMfdUA zmvB2WPQ8?O+Ih?!ls9r`a+73xbB`SSaL|wPhE0++LnKSM! zZCKJW37>tM!&cJ^`p?fsvL#uo64`4=ex;$L%781lnzkXZ|&%dOJI>pKicje>eLKK(UC1`On3 zTdK>jH(>7jPU&uYUt6qu(uzbHVf+WQso8p#6^^VsrC1!0CvR$ZljC?LOZwJ92+^w3(w~YTA*AadMl_zcI(rLJPeI6 z|Itvm1mhf$w7zWT6E=ug`AOh6X-j$og?NZ~wb5rsZDT0~dz{qXq0k6Ijia`!9ik+x zcY>`uZ%(#G_gV1?5EBwzKjpJe}JO9YYvA+W`Bs3(=yTJvKed z-eWLKRWL}=-2h#WFuwYQSI1Ij2uG|tD4rH5^Bm!Zt|hlxeCJ`pbE*0eLC5DGg7X{L zyE4kM>}3b7XRL4|fMupuiG`7rbU_r-D92!W)q^QI{TC)w)!uGC_j_1?)gTH1Pci^f z10K<*Llypmj*X&41AR_Yr|H{({FvsG3HAN!&Z($GC&ftba*(`XB$a*6@HM-fFwxWw zTeOT&V{VI4OTIa9E0#|E#a}V!zugr@Tw1C#)fscMLF%BP`f9r)SM$gZDG)88*sjJB zg%dYgjLf{14&@Y?DDL%41%vDYp-s)<44&*MP}4my>XNZbSX$kIhdrBeYFlmX{JDR; zYQ(~q-m6A^Y| zpw>62pqN^kPk8~iFnC3a3B(_p9Q8R*=|dEX!r4zP-{*9oLLvW)4151E1E`E5jq0(X zxr^W7*92x#wquldB2Y{HoREa{4i<>LfhS>}OkkJ3%A?DAh6ip-50_j)2YX2LImCj)XBX>0UYS3 zKvPa|VHW*H4f2k$vzh%n{Byx;eAjNr(`}>BQ#xL&)81>|h=cZl@ z{YrLVXFI`hlIahs15rPvya1hM_0OgezKafBjMKDLJo0kDndmoos`?Tb<3DtF0m#66 zN&9J4897QnS*0*)HAsaJNkF%;TVrVa{vI~za$r4>rlb!408J25u?V{u&-iuHmEfl! zUhI(NpZ-rN@9XD2t0Z@juXDJHAur|Z;Jfw8PQ|%2ULv+L_#&THkVXUl?|HYUC#-UR zrslbW7_@{z>PDvoUs4_{HCLJ>j`K#SM}ainxe(dvx71&N?F#OW#WYaP z(5gj^b6Ep4ov>KcS`Xqf`DGwJ9L?w z&Qx0AXrxkE4B~4r&#~!KJaen*TM`#87wSF8Jq*i#Dp!u%k+upvb_WbcXDJcV~KJ8$4yr8N(rYT z?2C#QlC^*6e0I@AK}~u4E?%vhV`8!D_}Cc5MZ4)%Hh82di7eqEFDMl^Veavj{>F%o zUBzt3K2e)~xTbJas$ZU_Si?&a7VO?tUk%D~My|5{P%p>lEeSN$*fR4;>dU+_aH_XT z&;FwH)}c*Z>fRhv=Vy8JF;skfUS>EJb6Wra4@Q^2<)3QlV^QIL$&=~Ts+?;RjhW19 zkoIo4?KxppBu!9wAMAH2$bYr*Q$;UFpno>x)L*ak4KPR&YvUtdeDM|yziYE~=ntj8 zY7|v^d7R$xwn*oN6vD-z%cO zrUbEhWrY=ua_tK<9i4t#*oFpL3n^tc8g4niZM;&!-CHbxK*2jwF5W2i#sWu`t#Sh` z$R>E+Ge^Y62@G=|A@Kyy>5c^L_c^52c3~2gKjTSy6}`oOulL;n`o?=t>D5|-L|&>h z7Y#EgR5gj84|k3-`P*$qcMkYpwu;LPhhU?U3m4tIf?>o=0MHed`r#!}U8rRZZ-#Eg z893sRPGOzP-BcOmXKlH)^G!@OFPR1n8FzFdX|jJ8;VC(~3Yt6Z^PS#Aeu(E4rwd)D zrUlw@e}RjzC`PMO#R}TP-h@^c3l=7}UQ+t5Ta9{bF(cj#H6R8g95KP2?M#GX)krfO z!%UxTDR8tL7X2YuE%bank-u6S3SK0E_{2Tu>go-R!60SBezEx|lzD$t17(ElEtc1& z>JhsT!&7VNTY^w)YZ+5>DBXETBC;B>B*>K{kJmqs$!Kcq0+mW@E$7|+(JkH~Z{0FV!c$}jv!OA+-Xo6>3wF6l@#?IMgc4yAsZrR#LBZ`<>drgupeN|L5C zPk$0t1(*C%wcmeFWi{pSN3#Rs`EGBbZ|#fE)2=qtU+f3-l!>_=yjCc-Ajz(RR8L}f z!bjoc78A5W0nUp4MC|NNE6i-rgOxO)h8N^6$!1VI|NJ|AwO%{VMyi!E`AoL03%607 zcmxL1R?)+Wu29M%IsWq}xcKW@uJb;AyX-=G*vKtYbYU?hAZ89Nq&l9VGV>FX5V z)aZ@pT!^Bh;+MZpwXZI%5&-rOh{~4<@64ksfc9+D*dg_j3Y`CLdyEwkdN@T#-*jOg zh~YTrU8A&Rd6DTE>9NAyuf$+A*4-kZ;-kqodStL9A^S#YJ8F!O%%3yE$~2izYYh6q z^L|5~>iKCEn_so<+2bGzW%8W#&LpL*#GWGErP$Sg9`QiU;F%OCO4?7jo0#zIw+3_4 zJW{P|b&ukQm+X3^7QkQT&1i0M>WDA!(Db|%dq-g)hyNZNz!Q7OL_eg}DK|4Bu`lMG zyPK%}aN@x%rz5JG@q@*C#e zF5Us6_j=PW%AZRpR%Xm+-d-Hj3{C)LDZOmdHI_7#44(N^#m~$$>X-04gH+Y(Oi$@S zB&fr$&fin{->n&TkxG8nYH_l?C5VGaIY*a}XBW;Js{jq6G~W@|C=c)uR!lkmdPI|` zx=yeI@UqEO9)-M|Rr;Bk-Eb9U6xHRy1j~0(7SF_nb0v5#DmchRngiO&e$PV|X8rOy z;ORTpB`s_6w^cHvbD9#Wm!ZRX75%HUemdY6el_P!{TKOeQO}KL z2$Z8JDxST0bK|3alB&~g9cC3-zVuxf`xX$@!31bHfj+|=J_g_zx^*_0nnJwa^HxPPtj4;uS z84?g$DC1LtWl=f*-uBWi0oiX>1;e@^+ceCo>q{hDUbuTCayqB23%YxoG+7{!H~DUT z131iGv!RXL1k154>c;D%4^8PIs58`^V=KXzJ`74kK+dQonaXn#Hgfx8-s)%kr$}Z@ zfSynmWd2`=UEOC?2-g5@I}R@AbAT*q+NBFcz9zn_sGg_fP62%T1w9$vU_uN8{Hc@N zSp{Uk{H9i^Hr-nGg{v|+kRL|I`dcjZ;HmW>6i1Qy9qsFmx|Qhp{3n7RAC-EQ6X*c2 zY2GnDL_*>wUitxE2~GS;T%S2{LupyO?|Z99qF%1y@iXTkb2Zv|F>(MIRX2^}sP}Xh zlz>W-aY>_DGA!{@?ouYATG<4mDvgfe;*EpWkxjs2&T|;8;`cvYjJn5>=zC>7cf6mJ z4RK;7#sc>Pw<4f2KVO;ajOTPe(u|9;8T*p9DmaqlGclV|tly(k&@?!3%Fwxqt7#bd z>DU*)yw}6z#%#}X0OnADo;|BomF@f%X;h2NlFNL9 z1^h9LUH4Uzj^4)jhJJEr9BTxc(%R#0H)GX--G*cG; zLm~;277f{r*6pb8F(6)j{fG9dxm-b)!IZLKlPrmxeE#nJHbeUe`%nYiV)zTS3tnH(`GL4`+6lyvi@5MeJBL<^E=Z9dSSPNqsX3iJ}@%I*+d_XduIpki8rQa!R|gA&=r zjEi)9hXNN)A;lt*CIo8cZ7)1?mF&dcn;}{X6~zY>{8hHnb7lW&R4ZtC_Ltl=BWgJq zXGTU2hr`KX?DUZ~?`r39dQQx_X=`XE{0HifzDlSm4@%9tIiKEn%L|g8-QivAsFTT& zRz$qk<+YHBiWSI_@5O18=^q?9bX8vLKPHx0)vj>tfwoc8({il|1G(+bbUJ@R=`)At)%y^nuQt+2o z6VCcF@k4TeOR?=GhwW+=XF;y-{qgjkjtTuE2!lVBFy5W8{hf!jh^b(;dWNrUh|t(s z8B=Rjiq2VDE9+(D+(;WH)SAnuu}}cDxE4uHSA8z4rM2rL#)#zehs1d|S$$0f!dc=7 zgbQM{-colsp8iZ@xL(4939Y8c4NEgGu2@ue1Sot)^feGfA_@R^NDUGMg z!3?#>7@N}sZ%Iq!{2I&7>C)oIzey)eDJa&^d55hyX897TZ*LduNHIgi37M$h{A0Hx z#)338lqx|5*F%(87I$_MBagGGKl4Wj%TBH+H^CGAPwc~RBA;=PmIz5$xhxrIi6B^! zZMqHnaapRCXDsje|FnJ4f#Wqr?LRiP-0EdC4p(9YEF!lz(=s1_vp(9AQr7qBdHz*yt_TiRT*)MY~-1zmWv>f`{T`ZnN zhk{udVjR~vw}E=xEkIbGqVFRmA98D7N)n{9!MJrE9OIdS=gta0)}ws?8@-rYUlIj< z!TA>!&Z z>4$T|`6s0n%#3p<^zDjz-RfF|lYq>@cHsK7eWi%DZ^^hhri(c)Xi4T71a82_250_Z zS#;2p$}@YY(s8Da^DCZ6y_L7$im0r*^ z7mKDSu`bZm0)$bn`7J8pU^dd5&ejZZo-dhrQeVV++EIXXeXCu`cF=Py#Mdv*KfT=% zKrscFA0%aZS6A$BFDg_(jw3j4R_CPd{eQV}PH~cM;B0;Iq2M`owhVE;a6Y9vluVF* zYO-z&cXyJr1j`TWWlJw|r>}EO5ib@ulF01R4tO)e931_g^lR#XL@U8*p&Al%7|nHz zC4tt7;x%X%w8)!B?LO4ZI`gF!!*}P;%AC7Q+{~8$OwieS^VVghiO;Yg$mU{luPlh1i4dt6a2q$UHkc4@U!Zb`8_e(c9o>xw)3AP>8eoE6w;uN=!wZ1Bce{&@V!sISKb zOEl;wEy>x5rM(MHGN_ghMU65ed}JBv`5buCWke5(OBW<(;C||qh&SOpt2GbOI!78 zBx@bCZp;7>vij9rU8fYUuN{qlKLv5KQS59iFffHJ8$<5P5knY33K zYk=~Oo^1JiGTz{8|14v5KdUx^!4x=1gCP&&>?)?_s=!0+J^vs-Ev-g9UB@xIWWn0( zevfM;1PzF}JA085Ga2Zxr`~_fcx@5tYA@5=`g_oAA_k7vpKSlA%M|k5$;iWy&p`y2 zqGOZ2JS>D#aY>a03r1OTE^60`ASVhX{Sy4*J8W_KvAnNnm=9oo?U6$3j{0LgPmG^L zknVND{(@$@<*TZz2%zt~V-cOk<`s0zVJ&9`QXfYuJ!^12u@GthL`~7x!J;S1=t8D;gg1Rz zUPW^``0?@)4t*XZp!F`^StK`LFkI^t>xro`tsFG{6uXq4-KRc%*r(l` zj~UBB^OK(0g(<=Ck-n7Vq?v25u;`3V9ZDCr`mt~Ol$2C`v$|^YM3>DkpuUSz7hhd2 z@w$wgwqtKk0Kv-aPul*1)MRO;ih=((gl?s5i3!=Sn7#Ct?HRkZpn$O0ja9s&ayMr^ zqmJ@o>=sg^=Rgtet#-p3@*#B`*KbjhjKj! z^mGYkeMj=)Du4ZmHE0Y6QeGp25Dk)yjiy{P`^KB2_wC#DUR2L@1Ps{z)e`%d( z{y;c~ODfLrheC-&Icg6Wl^?cu`sy8w4Y~8{y0D_>qrvQ?r-|mJzr_w2Bv=oBULO&J zfcnPvidBcK9;J57{c&|$n=KPyY&TT|4aUh*vW(hXWeo}#YYBlGkU*1NV8g~;R&lc) zb`HnDUDp?uQP++YCB^8DmifpAD9W+Rs55!w36?1G)hwg0vrPlEQON_n0}$$Yt%MdX z9d04GD<0D3@p~@JA@2k60xLz?QLL`FMWT)Oc+X=O(96tCI(x4cu~`%2{RCjV^NQ1l0AW35$_$7ngTVg0fm_H#1Gc=JN-FnFVbA&}sA zHFeAjoeKa0c@}L6$|ANqvB6q~0+k+1I4Ms#_HZ@aLHq(Lvsn-Y#jR+9eC{fZU?mYP z^u2&x>WjSTl($?A$vP8e|SWbg+mk{JT7u85e-dPkh z$goCf*X%<-};y6^YIus?qt5D*gVI$z1%KYA3 z(8O`QD6px&!8QGA+A^_dpM$fsrPO_*y;#GqQhX7=&lSH%X#zzBNDezuO>4dWGDsv{mk z_Hui-L;Mh+NbpbHOjnRZvkN{v7m;LRVkEUqc}%+h3!)L=J--QDb8D?}DJ6O11A7~P z`|g7G@3=)Z(iHt!?cx08qSq#)fAJ$_!#Z!EiT0<&a6&bMmi1X~;xusF!zbQ#Y6H-7 z!m*pQkWq6!6W^A-^A4K41S|M3T7v%U#1JQeMxtM$eXSw*HDA^Dgra*|a5uckBEZQ8 zooD@qkSS(KM@EfmrQ}tkrkr4gf>*uU)M);#odJuTl*^Cbc@+18II?gngZg(lvwog( zd}L(2h_LNfSr?Hx;iR6-12rqcYWL|<_Ezd??sdijEUeb)`vn&AecPq7`XI^yi=!Ty z4ZZA}ZrSFs zbQenQR^s$av_4JWf?U7!c;6K;pdV-!!Jw9;wB6Ldt6!9IT`&|?(ygo5VW4>WV zZQ;hP-Q4+oAN2~Xuo@N=5%vZ@M7kV$3DNO+#iuIUR>f-&$;Y1;o*(MS?Ni%j02fyuEf`=Mb_2ewakryGJS{(WE87nFTQN=T|9 z?X-wPxZ6TWn8eia&U}jxgr3%rY3|Iq_zL@b#W0Jcf0}}tR?H@+d`mUB7VByTrT_f` z)5~CYEZYLnD_wP*AiNSE*I~Y<=om=67$0|-k6U%D>v&5`{a`!7A{49;u5ya|mD0sF zse`~v0biNIq_`2f5Pf{44m7x)7sjw9a<3_2U2OS0$JN%iAenj(*&!mbP=*kgMM}MU zpGLkm8SA}s>b-Q5M1MQ0@;X0W0vKNhL~Yxx(Z*i)|$IajPZ*Q}EUjUg_6l-C5rxao&^?zA-_!Fg`}zg1ZO zpJ&K_T>He9^TxxJUzfzsHmDIKle9GimAqcXikTF7)y0X*g6_$ED12T0c*xT*Pk(YX zQgA=-QqD#F>t+*WukWxWs2zq%}=hB?Eg6X-o_KJ3erG*7*$?|7TvWjrx=FEFIN-^OQb z-5jA}gQPzEjc-|W^C3z3n;p4(*s#4>QH^-3wqv+kc1f5=*3Q61$Mv~s`xL(}#pR)N zV9x(>r?Te0%`WMC{W`(zD8>mSl39(;j;50FQ|jpDLt zkCB{u4)CH=t|mC`oGHNjJrThW$ldQU-k!%T7Aq1`Jz6Ax)jeK7SufdG2;PqBhQ zdln0KtaP(}3j3zF*Z&S74@VRo5C3i;H}lJPcc!;f6>r%dm>crqa*{6smsC0qpmhfo z9e4AG9S=IelUshh#iV&fX>?nswby|Uzv;|EMoU+te`(Nah2$;_m>opwy2MH zmUtenT<#|-mLKj<+wXJE36>_BouAyee;T5_JO6aAv`$ztvzz7wQK`MiEr~`|^CUUM zjV%p6Ke%AdQ>eZ8K}?os_gAuYj_Kc6c4XRhwYqybM>?_QcnU~moxSQvY0tg=VOab@` zJzBO+gKqK&eQM9FlD}3{VT*}~B)3)bVDs|{)ErjxVKWH}@QYdU3Yv3S2wGTi@$p&n za`8SsT;@U+f|eF$W_-MYmdT)cxBm?|TQ85rC!GAIf$Bdm@dls&ZQ4|W-2VoYXr%w& zfRM&eCNU8UYY|a13sXxgUJFw}VG%J?GfQ(`Qz3I}5i?7E5q?1{iyEdTMNCFMVSWJt zJ|V$Ju`M+hOOTnT6)Q-bpO;UFkMI8tCC4{c{ZAf~En4_wgavr{>Ho8iy!6iWc>ni9 zP((~b;QwnA<`?{L8?UH9@?;AWM3`6jznlmQ2#fre6Cpvq|FQ{+{5MXJSM?s6IosXQ8AHsvOm) ) ~= length( a(a=x1)&(x=x1)&(r Date: Sat, 28 Nov 2015 12:16:53 +0100 Subject: [PATCH 14/17] Zentral makefile include for chapters of script --- Makefile | 33 +++++--- bootstrap/lecture/Makefile | 29 ++----- bootstrap/lecture/bootstrap-chapter.tex | 6 +- chapter.mk | 52 ++++++++++++ designpattern/lecture/Makefile | 29 ++----- .../lecture/designpattern-chapter.tex | 6 +- likelihood/lecture/Makefile | 30 ++----- likelihood/lecture/likelihood-chapter.tex | 6 +- plotting/lecture/Makefile | 37 ++------- plotting/lecture/plotting-chapter.tex | 6 +- plotting/lecture/plotting.tex | 2 +- pointprocesses/lecture/Makefile | 37 ++------- .../lecture/pointprocesses-chapter.tex | 6 +- .../lecture/pointprocessscetchA.eps | 6 +- .../lecture/pointprocessscetchA.pdf | Bin 2765 -> 2765 bytes .../lecture/pointprocessscetchB.eps | 6 +- .../lecture/pointprocessscetchB.pdf | Bin 4673 -> 4673 bytes programming/lecture/Makefile | 30 ++----- programming/lecture/programming-chapter.tex | 4 +- programmingstyle/code/calculateSines.m | 32 ++++++++ programmingstyle/code/calculate_sines.m | 30 ------- programmingstyle/lecture/Makefile | 30 ++----- .../lecture/programmingstyle-chapter.tex | 6 +- programmingstyle/lecture/programmingstyle.tex | 76 +++++++++--------- regression/lecture/Makefile | 30 ++----- regression/lecture/regression-chapter.tex | 6 +- statistics/lecture/Makefile | 30 ++----- statistics/lecture/statistics-chapter.tex | 6 +- 28 files changed, 237 insertions(+), 334 deletions(-) create mode 100644 chapter.mk create mode 100644 programmingstyle/code/calculateSines.m delete mode 100644 programmingstyle/code/calculate_sines.m diff --git a/Makefile b/Makefile index a06b476..78e4a2f 100644 --- a/Makefile +++ b/Makefile @@ -3,29 +3,44 @@ BASENAME=scientificcomputing-script SUBDIRS=programming plotting programmingstyle statistics bootstrap regression likelihood pointprocesses designpattern SUBTEXS=$(foreach subd, $(SUBDIRS), $(subd)/lecture/$(subd).tex) -pdf : chapters $(BASENAME).pdf +all : script chapters chapters : - for sd in $(SUBDIRS); do $(MAKE) -C $$sd/lecture pdf; done + for sd in $(SUBDIRS); do $(MAKE) -C $$sd/lecture chapter; done + +script : plots $(BASENAME).pdf + + +plots : + for sd in $(SUBDIRS); do $(MAKE) -C $$sd/lecture plots; done + + +pdf : $(BASENAME).pdf $(BASENAME).pdf : $(BASENAME).tex header.tex $(SUBTEXS) pdflatex -interaction=scrollmode $< | tee /dev/stderr | fgrep -q "Rerun to get cross-references right" && pdflatex -interaction=scrollmode $< || true splitindex $(BASENAME).idx -again : - pdflatex $(BASENAME).tex - index : pdflatex -interaction=scrollmode $(BASENAME).tex splitindex $(BASENAME).idx pdflatex -interaction=scrollmode $(BASENAME).tex | tee /dev/stderr | fgrep -q "Rerun to get cross-references right" && pdflatex $(BASENAME).tex || true +again : + pdflatex $(BASENAME).tex + +watchpdf : + while true; do ! make -s -q pdf && make pdf; sleep 0.5; done + + +watchscript : + while true; do ! make -s -q script && make script; sleep 0.5; done + + clean : rm -f *~ $(BASENAME).aux $(BASENAME).log $(BASENAME).out $(BASENAME).toc $(BASENAME).lo? $(BASENAME).idx $(BASENAME)-term.i* $(BASENAME)-enterm.i* $(BASENAME)-code.i* for sd in $(SUBDIRS); do $(MAKE) -C $$sd/lecture clean; done cleanall : clean - rm -f $(PDFFILE) - -watchpdf : - while true; do ! make -q pdf && make pdf; sleep 0.5; done + rm -f $(BASENAME).pdf + for sd in $(SUBDIRS); do $(MAKE) -C $$sd/lecture cleanall; done diff --git a/bootstrap/lecture/Makefile b/bootstrap/lecture/Makefile index 7abf35f..3f9c4f6 100644 --- a/bootstrap/lecture/Makefile +++ b/bootstrap/lecture/Makefile @@ -1,32 +1,13 @@ BASENAME=bootstrap -PYFILES=$(wildcard *.py) -PYPDFFILES=$(PYFILES:.py=.pdf) - all : pdf -# script: -pdf : $(BASENAME)-chapter.pdf - -$(BASENAME)-chapter.pdf : $(BASENAME)-chapter.tex $(BASENAME).tex $(PYPDFFILES) - CHAPTER=$$(( $$(sed -n -e '/contentsline {chapter}/{s/.*numberline {\([0123456789]*\)}.*/\1/; p}' $(BASENAME).aux) - 1 )); \ - PAGE=$$(sed -n -e '/contentsline {chapter}/{s/.*numberline {.*}.*}{\(.*\)}{chapter.*/\1/; p}' $(BASENAME).aux); \ - sed -i -e "s/setcounter{page}{.*}/setcounter{page}{$$PAGE}/; s/setcounter{chapter}{.*}/setcounter{chapter}{$$CHAPTER}/" $(BASENAME)-chapter.tex - pdflatex -interaction=scrollmode $< | tee /dev/stderr | fgrep -q "Rerun to get cross-references right" && pdflatex -interaction=scrollmode $< || true +include ../../chapter.mk -$(PYPDFFILES) : %.pdf : %.py - python $< - -clean : - rm -f *~ - rm -f $(BASENAME).aux $(BASENAME).log - rm -f $(BASENAME)-chapter.aux $(BASENAME)-chapter.log $(BASENAME)-chapter.out - rm -f $(PYPDFFILES) $(GPTTEXFILES) - -cleanall : clean - rm -f $(BASENAME)-chapter.pdf +# script: +pdf : chapter -watchpdf : - while true; do ! make -q pdf && make pdf; sleep 0.5; done +clean : cleanchapter +cleanall : clean cleanchapter diff --git a/bootstrap/lecture/bootstrap-chapter.tex b/bootstrap/lecture/bootstrap-chapter.tex index 29816da..2b3dbe8 100644 --- a/bootstrap/lecture/bootstrap-chapter.tex +++ b/bootstrap/lecture/bootstrap-chapter.tex @@ -5,8 +5,10 @@ \lstset{inputpath=../code} \graphicspath{{figures/}} -\setcounter{page}{69} -\setcounter{chapter}{4} +\typein[\pagenumber]{Number of first page} +\typein[\chapternumber]{Chapter number} +\setcounter{page}{\pagenumber} +\setcounter{chapter}{\chapternumber} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% diff --git a/chapter.mk b/chapter.mk new file mode 100644 index 0000000..8a56ed1 --- /dev/null +++ b/chapter.mk @@ -0,0 +1,52 @@ +# plots: +plots : pythonplots gnuplots + +# python plots: +PYFILES=$(wildcard *.py) +PYPDFFILES=$(PYFILES:.py=.pdf) + +pythonplots : $(PYPDFFILES) + +$(PYPDFFILES) : %.pdf: %.py + python $< + +cleanpythonplots : + rm -f $(PYPDFFILES) + + +# gnuplot plots: +GPTFILES=$(wildcard *.gpt) +GPTTEXFILES=$(GPTFILES:.gpt=.tex) + +gnuplots : $(GPTTEXFILES) + +$(GPTTEXFILES) : %.tex: %.gpt whitestyles.gp + gnuplot whitestyles.gp $< + epstopdf $*.eps + +cleangnuplots : + rm -f $(GPTTEXFILES) + + +# script: +chapter : $(BASENAME)-chapter.pdf + +$(BASENAME)-chapter.pdf : $(BASENAME)-chapter.tex $(BASENAME).tex $(wildcard $(BASENAME).aux) $(PYPDFFILES) $(GPTTEXFILES) + if test -f $(BASENAME).aux; then \ + CHAPTER=$$(( $$(sed -n -e '/contentsline {chapter}/{s/.*numberline {\([0123456789]*\)}.*/\1/; p}' $(BASENAME).aux) - 1 )); \ + PAGE=$$(sed -n -e '/contentsline {chapter}/{s/.*numberline {.*}.*}{\(.*\)}{chapter.*/\1/; p}' $(BASENAME).aux); \ + fi; \ + { echo $${PAGE:=1}; echo $${CHAPTER:=0}; } | pdflatex -interaction=scrollmode $< | tee /dev/stderr | fgrep -q "Rerun to get cross-references right" && { echo $${PAGE:=1}; echo $${CHAPTER:=0}; } | pdflatex -interaction=scrollmode $< || true + +watchchapter : + while true; do ! make -q chapter && make chapter; sleep 0.5; done + + +cleanchapter : cleanpythonplots cleangnuplots + rm -f *~ + rm -f $(BASENAME).aux $(BASENAME).log + rm -f $(BASENAME)-chapter.aux $(BASENAME)-chapter.log $(BASENAME)-chapter.out $(BASENAME)-chapter.idx + + +cleanallchapter : cleanchapter + rm -f $(BASENAME)-chapter.pdf diff --git a/designpattern/lecture/Makefile b/designpattern/lecture/Makefile index 145c35c..e7312a5 100644 --- a/designpattern/lecture/Makefile +++ b/designpattern/lecture/Makefile @@ -1,32 +1,13 @@ BASENAME=designpattern -PYFILES=$(wildcard *.py) -PYPDFFILES=$(PYFILES:.py=.pdf) - all : pdf -# script: -pdf : $(BASENAME)-chapter.pdf - -$(BASENAME)-chapter.pdf : $(BASENAME)-chapter.tex $(BASENAME).tex $(PYPDFFILES) - CHAPTER=$$(( $$(sed -n -e '/contentsline {chapter}/{s/.*numberline {\([0123456789]*\)}.*/\1/; p}' $(BASENAME).aux) - 1 )); \ - PAGE=$$(sed -n -e '/contentsline {chapter}/{s/.*numberline {.*}.*}{\(.*\)}{chapter.*/\1/; p}' $(BASENAME).aux); \ - sed -i -e "s/setcounter{page}{.*}/setcounter{page}{$$PAGE}/; s/setcounter{chapter}{.*}/setcounter{chapter}{$$CHAPTER}/" $(BASENAME)-chapter.tex - pdflatex -interaction=scrollmode $< | tee /dev/stderr | fgrep -q "Rerun to get cross-references right" && pdflatex -interaction=scrollmode $< || true +include ../../chapter.mk -$(PYPDFFILES) : %.pdf : %.py - python $< - -clean : - rm -f *~ - rm -f $(BASENAME).aux $(BASENAME).log - rm -f $(BASENAME)-chapter.aux $(BASENAME)-chapter.log $(BASENAME)-chapter.out - rm -f $(PYPDFFILES) $(GPTTEXFILES) - -cleanall : clean - rm -f $(BASENAME)-chapter.pdf +# script: +pdf : chapter -watchpdf : - while true; do ! make -q pdf && make pdf; sleep 0.5; done +clean : cleanchapter +cleanall : clean cleanchapter diff --git a/designpattern/lecture/designpattern-chapter.tex b/designpattern/lecture/designpattern-chapter.tex index 31c6e00..4bb7291 100644 --- a/designpattern/lecture/designpattern-chapter.tex +++ b/designpattern/lecture/designpattern-chapter.tex @@ -5,8 +5,10 @@ \lstset{inputpath=../code} \graphicspath{{figures/}} -\setcounter{page}{121} -\setcounter{chapter}{8} +\typein[\pagenumber]{Number of first page} +\typein[\chapternumber]{Chapter number} +\setcounter{page}{\pagenumber} +\setcounter{chapter}{\chapternumber} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% diff --git a/likelihood/lecture/Makefile b/likelihood/lecture/Makefile index 51e7876..17f92ae 100644 --- a/likelihood/lecture/Makefile +++ b/likelihood/lecture/Makefile @@ -1,32 +1,12 @@ BASENAME=likelihood -PYFILES=$(wildcard *.py) -PYPDFFILES=$(PYFILES:.py=.pdf) - all : pdf -# script: -pdf : $(BASENAME)-chapter.pdf - -$(BASENAME)-chapter.pdf : $(BASENAME)-chapter.tex $(BASENAME).tex $(PYPDFFILES) - CHAPTER=$$(( $$(sed -n -e '/contentsline {chapter}/{s/.*numberline {\([0123456789]*\)}.*/\1/; p}' $(BASENAME).aux) - 1 )); \ - PAGE=$$(sed -n -e '/contentsline {chapter}/{s/.*numberline {.*}.*}{\(.*\)}{chapter.*/\1/; p}' $(BASENAME).aux); \ - sed -i -e "s/setcounter{page}{.*}/setcounter{page}{$$PAGE}/; s/setcounter{chapter}{.*}/setcounter{chapter}{$$CHAPTER}/" $(BASENAME)-chapter.tex - pdflatex -interaction=scrollmode $< | tee /dev/stderr | fgrep -q "Rerun to get cross-references right" && pdflatex -interaction=scrollmode $< || true - -$(PYPDFFILES) : %.pdf : %.py - python $< +include ../../chapter.mk -clean : - rm -f *~ - rm -f $(BASENAME).aux $(BASENAME).log - rm -f $(BASENAME)-chapter.aux $(BASENAME)-chapter.log $(BASENAME)-chapter.out - rm -f $(PYPDFFILES) $(GPTTEXFILES) - -cleanall : clean - rm -f $(BASENAME)-chapter.pdf - -watchpdf : - while true; do ! make -q pdf && make pdf; sleep 0.5; done +# script: +pdf : chapter +clean : cleanchapter +cleanall : clean cleanchapter diff --git a/likelihood/lecture/likelihood-chapter.tex b/likelihood/lecture/likelihood-chapter.tex index 714919a..bb4182a 100644 --- a/likelihood/lecture/likelihood-chapter.tex +++ b/likelihood/lecture/likelihood-chapter.tex @@ -5,8 +5,10 @@ \lstset{inputpath=../code} \graphicspath{{figures/}} -\setcounter{page}{89} -\setcounter{chapter}{6} +\typein[\pagenumber]{Number of first page} +\typein[\chapternumber]{Chapter number} +\setcounter{page}{\pagenumber} +\setcounter{chapter}{\chapternumber} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% diff --git a/plotting/lecture/Makefile b/plotting/lecture/Makefile index 3fa9e21..5e11607 100644 --- a/plotting/lecture/Makefile +++ b/plotting/lecture/Makefile @@ -1,21 +1,12 @@ BASENAME=plotting -PYFILES=$(wildcard *.py) -PYPDFFILES=$(PYFILES:.py=.pdf) - -GPTFILES=$(wildcard *.gpt) -GPTTEXFILES=$(GPTFILES:.gpt=.tex) - all: pdf slides thumbs +include ../../chapter.mk + # script: -pdf : $(BASENAME)-chapter.pdf -$(BASENAME)-chapter.pdf : $(BASENAME)-chapter.tex $(BASENAME).tex $(GPTTEXFILES) $(PYPDFFILES) ../../header.tex - CHAPTER=$$(( $$(sed -n -e '/contentsline {chapter}/{s/.*numberline {\([0123456789]*\)}.*/\1/; p}' $(BASENAME).aux) - 1 )); \ - PAGE=$$(sed -n -e '/contentsline {chapter}/{s/.*numberline {.*}.*}{\(.*\)}{chapter.*/\1/; p}' $(BASENAME).aux); \ - sed -i -e "s/setcounter{page}{.*}/setcounter{page}{$$PAGE}/; s/setcounter{chapter}{.*}/setcounter{chapter}{$$CHAPTER}/" $(BASENAME)-chapter.tex - pdflatex -interaction=scrollmode $< | tee /dev/stderr | fgrep -q "Rerun to get cross-references right" && pdflatex -interaction=scrollmode $< || true +pdf : chapter # slides: @@ -31,31 +22,15 @@ $(BASENAME)-handout.pdf: $(BASENAME)-slides.tex $(GPTTEXFILES) pdfnup --nup 2x4 --no-landscape --paper a4paper --trim "-1cm -1cm -1cm -1cm" --outfile $@ thumbsfoils.pdf # 1-19 rm thumbsfoils.* -watchpdf : - while true; do ! make -q pdf && make pdf; sleep 0.5; done - watchslides : while true; do ! make -q slides && make slides; sleep 0.5; done -# python plots: -$(PYPDFFILES) : %.pdf: %.py - python $< - -# gnuplot plots: -$(GPTTEXFILES) : %.tex: %.gpt whitestyles.gp - gnuplot whitestyles.gp $< - epstopdf $*.eps - -clean : - rm -f *~ - rm -f $(BASENAME).aux $(BASENAME).log - rm -f $(BASENAME)-chapter.aux $(BASENAME)-chapter.log $(BASENAME)-chapter.out +clean : cleanchapter rm -f $(BASENAME)-slides.aux $(BASENAME)-slides.log $(BASENAME)-slides.out $(BASENAME)-slides.toc $(BASENAME)-slides.nav $(BASENAME)-slides.snm $(BASENAME)-slides.vrb - rm -f $(PYPDFFILES) $(GPTTEXFILES) -cleanall : clean - rm -f $(BASENAME)-chapter.pdf $(BASENAME)-slides.pdf $(BASENAME)-handout.pdf +cleanall : clean cleanallchapter + rm -f $(BASENAME)-slides.pdf $(BASENAME)-handout.pdf help : diff --git a/plotting/lecture/plotting-chapter.tex b/plotting/lecture/plotting-chapter.tex index 9dab40d..7498863 100644 --- a/plotting/lecture/plotting-chapter.tex +++ b/plotting/lecture/plotting-chapter.tex @@ -5,8 +5,10 @@ \lstset{inputpath=../code} \graphicspath{{images/}} -\setcounter{page}{33} -\setcounter{chapter}{1} +\typein[\pagenumber]{Number of first page} +\typein[\chapternumber]{Chapter number} +\setcounter{page}{\pagenumber} +\setcounter{chapter}{\chapternumber} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% diff --git a/plotting/lecture/plotting.tex b/plotting/lecture/plotting.tex index f843f6f..df502de 100644 --- a/plotting/lecture/plotting.tex +++ b/plotting/lecture/plotting.tex @@ -1,4 +1,4 @@ -\chapter{\tr{Data plotting}{Graphische Darstellung von Daten}} +\chapter{Graphische Darstellung von Daten} Die F\"ahigkeit zur ad\"aquaten Darstellung wissenschaftlicher Daten darf durchaus zu den notwendigen Kernkompetenzen gez\"ahlt werden. Wir diff --git a/pointprocesses/lecture/Makefile b/pointprocesses/lecture/Makefile index 44c7d3b..e53a65d 100644 --- a/pointprocesses/lecture/Makefile +++ b/pointprocesses/lecture/Makefile @@ -1,21 +1,12 @@ BASENAME=pointprocesses -PYFILES=$(wildcard *.py) -PYPDFFILES=$(PYFILES:.py=.pdf) - -GPTFILES=$(wildcard *.gpt) -GPTTEXFILES=$(GPTFILES:.gpt=.tex) - all: pdf slides thumbs +include ../../chapter.mk + # script: -pdf : $(BASENAME)-chapter.pdf -$(BASENAME)-chapter.pdf : $(BASENAME)-chapter.tex $(BASENAME).tex ../../header.tex $(GPTTEXFILES) $(PYPDFFILES) - CHAPTER=$$(( $$(sed -n -e '/contentsline {chapter}/{s/.*numberline {\([0123456789]*\)}.*/\1/; p}' $(BASENAME).aux) - 1 )); \ - PAGE=$$(sed -n -e '/contentsline {chapter}/{s/.*numberline {.*}.*}{\(.*\)}{chapter.*/\1/; p}' $(BASENAME).aux); \ - sed -i -e "s/setcounter{page}{.*}/setcounter{page}{$$PAGE}/; s/setcounter{chapter}{.*}/setcounter{chapter}{$$CHAPTER}/" $(BASENAME)-chapter.tex - pdflatex -interaction=scrollmode $< | tee /dev/stderr | fgrep -q "Rerun to get cross-references right" && pdflatex -interaction=scrollmode $< || true +pdf : chapter # slides: @@ -31,31 +22,15 @@ $(BASENAME)-handout.pdf: $(BASENAME)-slides.tex $(GPTTEXFILES) pdfnup --nup 2x4 --no-landscape --paper a4paper --trim "-1cm -1cm -1cm -1cm" --outfile $@ thumbsfoils.pdf # 1-19 rm thumbsfoils.* -watchpdf : - while true; do ! make -q pdf && make pdf; sleep 0.5; done - watchslides : while true; do ! make -q slides && make slides; sleep 0.5; done -# python plots: -$(PYPDFFILES) : %.pdf: %.py - python $< - -# gnuplot plots: -$(GPTTEXFILES) : %.tex: %.gpt whitestyles.gp - gnuplot whitestyles.gp $< - epstopdf $*.eps - -clean : - rm -f *~ - rm -f $(BASENAME).aux $(BASENAME).log - rm -f $(BASENAME)-chapter.aux $(BASENAME)-chapter.log $(BASENAME)-chapter.out +clean : cleanchapter rm -f $(BASENAME)-slides.aux $(BASENAME)-slides.log $(BASENAME)-slides.out $(BASENAME)-slides.toc $(BASENAME)-slides.nav $(BASENAME)-slides.snm $(BASENAME)-slides.vrb - rm -f $(PYPDFFILES) $(GPTTEXFILES) -cleanall : clean - rm -f $(BASENAME)-chapter.pdf $(BASENAME)-slides.pdf $(BASENAME)-handout.pdf +cleanall : clean cleanchapter + $(BASENAME)-slides.pdf $(BASENAME)-handout.pdf help : diff --git a/pointprocesses/lecture/pointprocesses-chapter.tex b/pointprocesses/lecture/pointprocesses-chapter.tex index 3dfc545..f9f25a7 100644 --- a/pointprocesses/lecture/pointprocesses-chapter.tex +++ b/pointprocesses/lecture/pointprocesses-chapter.tex @@ -5,8 +5,10 @@ \lstset{inputpath=../code} \graphicspath{{figures/}} -\setcounter{page}{99} -\setcounter{chapter}{7} +\typein[\pagenumber]{Number of first page} +\typein[\chapternumber]{Chapter number} +\setcounter{page}{\pagenumber} +\setcounter{chapter}{\chapternumber} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% diff --git a/pointprocesses/lecture/pointprocessscetchA.eps b/pointprocesses/lecture/pointprocessscetchA.eps index de57b17..3b37567 100644 --- a/pointprocesses/lecture/pointprocessscetchA.eps +++ b/pointprocesses/lecture/pointprocessscetchA.eps @@ -1,7 +1,7 @@ %!PS-Adobe-2.0 EPSF-2.0 %%Title: pointprocessscetchA.tex %%Creator: gnuplot 4.6 patchlevel 4 -%%CreationDate: Mon Nov 23 13:45:26 2015 +%%CreationDate: Sat Nov 28 12:01:31 2015 %%DocumentFonts: %%BoundingBox: 50 50 373 135 %%EndComments @@ -430,10 +430,10 @@ SDict begin [ /Title (pointprocessscetchA.tex) /Subject (gnuplot plot) /Creator (gnuplot 4.6 patchlevel 4) - /Author (grewe) + /Author (jan) % /Producer (gnuplot) % /Keywords () - /CreationDate (Mon Nov 23 13:45:26 2015) + /CreationDate (Sat Nov 28 12:01:31 2015) /DOCINFO pdfmark end } ifelse diff --git a/pointprocesses/lecture/pointprocessscetchA.pdf b/pointprocesses/lecture/pointprocessscetchA.pdf index 57b844721fb807c21def0ff5ac59274c54bd1a75..e77278a7d83e6da5c077855485c5f1e6028b22e8 100644 GIT binary patch delta 307 zcmX>rdRBD9QD)xMR7105)5K)myIJiqL?tH6v#FqpZVq58Vlo06?U!Gs zU}T{Hvr)mwz|d5aOW!v?#U-&MRl~&!Bw%Q0WMK$o7#nW>!coH*Yvkr^YVK@cT2R*Y3OQdY~t$VY-dAIMJ$({9anKlVo^y&QED2Ok%^%Zm#V6(zZ(|- DBF0mY delta 307 zcmX>rdRBD9QD$CKLqntFGy@aeWJ{yO$pLKglRq+NVG(U-vEecbF*LF=F|aZ)ntYZ; zQ@k`!LDw%|w@e|#$jC~;&yIJiqL?tH6v#FqpZVq58Vlo06?U!Gs zU}U5Kvr)mwz|d5aOW!v?#U-&MRl~&!Bmi{0k)e@^fq~KHFB~M$@Bo>ua6s4wd8JQRwajB}h`nz!f E00Z_;-T(jq diff --git a/pointprocesses/lecture/pointprocessscetchB.eps b/pointprocesses/lecture/pointprocessscetchB.eps index ab1db53..e3199ee 100644 --- a/pointprocesses/lecture/pointprocessscetchB.eps +++ b/pointprocesses/lecture/pointprocessscetchB.eps @@ -1,7 +1,7 @@ %!PS-Adobe-2.0 EPSF-2.0 %%Title: pointprocessscetchB.tex %%Creator: gnuplot 4.6 patchlevel 4 -%%CreationDate: Mon Nov 23 13:46:59 2015 +%%CreationDate: Sat Nov 28 12:01:32 2015 %%DocumentFonts: %%BoundingBox: 50 50 373 237 %%EndComments @@ -430,10 +430,10 @@ SDict begin [ /Title (pointprocessscetchB.tex) /Subject (gnuplot plot) /Creator (gnuplot 4.6 patchlevel 4) - /Author (grewe) + /Author (jan) % /Producer (gnuplot) % /Keywords () - /CreationDate (Mon Nov 23 13:46:59 2015) + /CreationDate (Sat Nov 28 12:01:32 2015) /DOCINFO pdfmark end } ifelse diff --git a/pointprocesses/lecture/pointprocessscetchB.pdf b/pointprocesses/lecture/pointprocessscetchB.pdf index ddce0a767df784a77495e6b8ae3264617b7a62f9..12d36215bf26fbf58737ddcc80f05a796d5bdaca 100644 GIT binary patch delta 302 zcmX@8a!_T1B{y$sYGRscvQe^ba!N|lWC33J$*J5~7@`W3|8QG#T7(!HSs55w8BccL z(Gp24QPB0v*DX^BF|x2yFth?mO|Ii<#n2pwAtEt(GOr4TsQl)~yunO{Ky&@_%M^?( z6ri>lDHs_Tnrd?C`{t*(B$lLVxLAP%3=NGe41o;e&FKQQjImBmMh50aW=2ky24)r( zj?T`m2Cn8#&IXo1j*+RclbsDg6|r1)c3j0JiA5z9MX70ACdNhvT&k+B{%%|V3>HzP delta 302 zcmX@8a!_T1B{#3Bp`lT7nt_RKvZYbtWC33J$*J5~7@`W3|8QG#8ig1dS(zAE8BBKI z(Gn@mQ_%Ix*DX^BF*34JFth?mO|Ii<#n2pwAtEt(GOr4TsQl)~yunO{Ky&@_%M^@^ z6ri>lDHs_Tnrd?C`{t*(B$lLVxLAP%fDSh@G%_(T*qkm<%NT2D>}+6RY~bo_>1ttY zW?*4v|$=|n7XT9V BOb7q~ diff --git a/programming/lecture/Makefile b/programming/lecture/Makefile index 379ae0e..41ff3c5 100644 --- a/programming/lecture/Makefile +++ b/programming/lecture/Makefile @@ -2,33 +2,13 @@ BASENAME=programming #TEXFILES=boolean_logical_indexing.tex control_structures.tex data_structures.tex plotting.tex programming_basics.tex scripts_functions.tex sta_stc.tex variables_datatypes.tex vectors_matrices.tex -PYFILES=$(wildcard *.py) -PYPDFFILES=$(PYFILES:.py=.pdf) - all : pdf -# script: -pdf : $(BASENAME)-chapter.pdf - -$(BASENAME)-chapter.pdf : $(BASENAME)-chapter.tex $(BASENAME).tex $(PYPDFFILES) ../../header.tex - CHAPTER=$$(( $$(sed -n -e '/contentsline {chapter}/{s/.*numberline {\([0123456789]*\)}.*/\1/; p}' $(BASENAME).aux) - 1 )); \ - PAGE=$$(sed -n -e '/contentsline {chapter}/{s/.*numberline {.*}.*}{\(.*\)}{chapter.*/\1/; p}' $(BASENAME).aux); \ - sed -i -e "s/setcounter{page}{.*}/setcounter{page}{$$PAGE}/; s/setcounter{chapter}{.*}/setcounter{chapter}{$$CHAPTER}/" $(BASENAME)-chapter.tex - pdflatex -interaction=scrollmode $< | tee /dev/stderr | fgrep -q "Rerun to get cross-references right" && pdflatex -interaction=scrollmode $< || true - -$(PYPDFFILES) : %.pdf : %.py - python $< +include ../../chapter.mk -clean : - rm -f *~ - rm -f $(BASENAME).aux $(BASENAME).log - rm -f $(BASENAME)-chapter.aux $(BASENAME)-chapter.log $(BASENAME)-chapter.out - rm -f $(PYPDFFILES) $(GPTTEXFILES) - -cleanall : clean - rm -f $(BASENAME)-chapter.pdf - -watchpdf : - while true; do ! make -q pdf && make pdf; sleep 0.5; done +# script: +pdf : chapter +clean : cleanchapter +cleanall : clean cleanchapter diff --git a/programming/lecture/programming-chapter.tex b/programming/lecture/programming-chapter.tex index 8eb19a1..62fce49 100644 --- a/programming/lecture/programming-chapter.tex +++ b/programming/lecture/programming-chapter.tex @@ -5,7 +5,9 @@ \lstset{inputpath=../code} \graphicspath{{images/}} -\setcounter{page}{15} +\typein[\pagenumber]{Number of first page} +\typein[\chapternumber]{Chapter number} +\setcounter{page}{3} \setcounter{chapter}{0} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% diff --git a/programmingstyle/code/calculateSines.m b/programmingstyle/code/calculateSines.m new file mode 100644 index 0000000..15008f8 --- /dev/null +++ b/programmingstyle/code/calculateSines.m @@ -0,0 +1,32 @@ +function sines = calculateSines(times, amplitudes, frequencies) +% Function calculates sinewaves with all combinations of +% given amplitudes and frequencies. +% +% sines = calculateSines(times, amplitudes, frequencies) +% +% Arguments: +% times : vector of times as which the sines should be computed. +% amplitudes : vector with amplitudes. +% frequencies: vector with frequencies. +% +% Returns: +% a 3-D Matrix of sinewaves, 2nd dimension represents +% the amplitudes, 3rd the frequencies. + sines = zeros(length(times), length(amplitudes), length(frequencies)); + for i = 1:length(amplitudes) + sines(:,i,:) = sinesWithFrequencies(times, amplitudes(i), frequencies); + end +end + + +function sines = sinesWithFrequencies(times, amplitude, frequencies) + sines = zeros(length(times), length(frequencies)); + for i = 1:length(frequencies) + sines(:,i) = sineWave(times, amplitude, frequencies(i)); + end +end + + +function sine = sineWave(times, amplitude, frequency) + sine = sin(2.0*pi.*times*frequency) .* amplitude; +end diff --git a/programmingstyle/code/calculate_sines.m b/programmingstyle/code/calculate_sines.m deleted file mode 100644 index 05ad1ca..0000000 --- a/programmingstyle/code/calculate_sines.m +++ /dev/null @@ -1,30 +0,0 @@ -function sines = calculate_sines(x, amplitudes, frequencies) - % Function calculates sinewaves with all combinations of - % given amplitudes and frequencies. - % Arguments: x, a vector of radiants for which the sine should be - % computed. - % amplitudes, a vector of amplitudes. - % frequencies, a vector of frequencies. - % - % Returns: a 3-D Matrix of sinewaves, 2nd dimension represents - % the amplitudes, 3rd the frequencies. - - sines = zeros(length(x), length(amplitudes), length(frequencies)); - - for i = 1:length(amplitudes) - sines(:,i,:) = sines_with_frequencies(x, amplitudes(i), frequencies); - end -end - - -function sines = sines_with_frequencies(x, amplitude, frequencies) - sines = zeros(length(x), length(frequencies)); - for i = 1:length(frequencies) - sines(:,i) = sinewave(x, amplitude, frequencies(i)); - end -end - - -function sine = sinewave(x, amplitude, frequency) - sine = sin(2 .* pi .* x *frequency) .* amplitude; -end diff --git a/programmingstyle/lecture/Makefile b/programmingstyle/lecture/Makefile index 463f202..4c7aa7c 100644 --- a/programmingstyle/lecture/Makefile +++ b/programmingstyle/lecture/Makefile @@ -1,32 +1,12 @@ BASENAME=programmingstyle -PYFILES=$(wildcard *.py) -PYPDFFILES=$(PYFILES:.py=.pdf) - all : pdf -# script: -pdf : $(BASENAME)-chapter.pdf - -$(BASENAME)-chapter.pdf : $(BASENAME)-chapter.tex $(BASENAME).tex $(PYPDFFILES) ../../header.tex - CHAPTER=$$(( $$(sed -n -e '/contentsline {chapter}/{s/.*numberline {\([0123456789]*\)}.*/\1/; p}' $(BASENAME).aux) - 1 )); \ - PAGE=$$(sed -n -e '/contentsline {chapter}/{s/.*numberline {.*}.*}{\(.*\)}{chapter.*/\1/; p}' $(BASENAME).aux); \ - sed -i -e "s/setcounter{page}{.*}/setcounter{page}{$$PAGE}/; s/setcounter{chapter}{.*}/setcounter{chapter}{$$CHAPTER}/" $(BASENAME)-chapter.tex - pdflatex -interaction=scrollmode $< | tee /dev/stderr | fgrep -q "Rerun to get cross-references right" && pdflatex -interaction=scrollmode $< || true - -$(PYPDFFILES) : %.pdf : %.py - python $< +include ../../chapter.mk -clean : - rm -f *~ - rm -f $(BASENAME).aux $(BASENAME).log - rm -f $(BASENAME)-chapter.aux $(BASENAME)-chapter.log $(BASENAME)-chapter.out - rm -f $(PYPDFFILES) $(GPTTEXFILES) - -cleanall : clean - rm -f $(BASENAME)-chapter.pdf - -watchpdf : - while true; do ! make -q pdf && make pdf; sleep 0.5; done +# script: +pdf : chapter +clean : cleanchapter +cleanall : clean cleanchapter diff --git a/programmingstyle/lecture/programmingstyle-chapter.tex b/programmingstyle/lecture/programmingstyle-chapter.tex index df8f625..58fddce 100644 --- a/programmingstyle/lecture/programmingstyle-chapter.tex +++ b/programmingstyle/lecture/programmingstyle-chapter.tex @@ -5,8 +5,10 @@ \lstset{inputpath=../code} \graphicspath{{figures/}} -\setcounter{page}{45} -\setcounter{chapter}{2} +\typein[\pagenumber]{Number of first page} +\typein[\chapternumber]{Chapter number} +\setcounter{page}{\pagenumber} +\setcounter{chapter}{\chapternumber} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% diff --git a/programmingstyle/lecture/programmingstyle.tex b/programmingstyle/lecture/programmingstyle.tex index 35b3c88..04eaa8c 100644 --- a/programmingstyle/lecture/programmingstyle.tex +++ b/programmingstyle/lecture/programmingstyle.tex @@ -6,14 +6,16 @@ wissenschaftlichen Erkenntnisgewinn reproduzierbar zu machen. Programme sollten so geschrieben und strukturiert sein, dass es sowohl -einem Au{\ss}enstehenden als auch einem selbst, nach ein paar Monaten, -leicht f\"allt den Programmablauf nachzuvollziehen und zu -verstehen. Saubere Programmierung zahlt sich aber in erster Linie -f\"ur den Verfasser eines Programmes aus. +einem Au{\ss}enstehenden als auch einem selbst --- nach ein paar +Wochen oder Monaten! --- leicht f\"allt den Programmablauf +nachzuvollziehen und zu verstehen. Saubere Programmierung zahlt sich +in erster Linie f\"ur einen selbst aus und macht es aber gleichzeitig +f\"ur andere Personen leichter, den Code nachzuvollziehen und zu +benutzen. Guter Programmierstil greift auf unterschiedlichen Ebenen an: \begin{enumerate} -\item Die Struktur von Programmen. +\item Die Dateistruktur von Programmen. \item Die Namensgebung von Skripten und Funktionen. \item Die Namensgebung f\"ur Variablen und Konstanten. \item Die Verwendung von Einr\"uckungen und Leerzeilen um Bl\"ocke im @@ -65,7 +67,7 @@ aktuellen Ordner nach passenden Dateien sucht (mehr Information zum \matlab-Suchpfad in Box~\ref{matlabpathbox}). \begin{figure}[tp] - \includegraphics[width=0.75\textwidth]{program_organization} + \includegraphics[width=0.82\textwidth]{program_organization} \titlecaption{\label{fileorganizationfig} M\"ogliche Organisation von Programmcode im Dateisystem.}{ F\"ur jedes Projekt werden Unterordner f\"ur die einzelnen Analysen angelegt. Auf Ebene des @@ -82,46 +84,45 @@ aktuellen Ordner nach passenden Dateien sucht (mehr Information zum (siehe Abbildung). Der \codeterm{Suchpfad} ist eine Liste von Ordnern in denen \matlab{} nach Funktionen und Skripten suchen soll. Die Suche nach der aufgerufenen Funktion wird dabei von oben - nach unten durchgef\"uhrt. Das heisst, dass es, bei - Namensgleichheit, eine Rolle spielen kann an welcher Stelle im + nach unten durchgef\"uhrt. Das heisst, dass es bei + Namensgleichheit eine Rolle spielen kann an welcher Stelle im Suchpfad der erste Treffer gefunden wird. Wichtig: \matlab{} sucht nicht rekursiv! Wenn die gew\"unschte Funktion in einem Unterordner des aktuellen Arbeitsverzeichnisses liegt, dieses aber nicht explizit im Suchpfad enthalten ist, so wird die Funktion nicht - gefunden werden. + gefunden. \vspace{2ex} - \includegraphics[width=0.75\textwidth]{search_path} + \includegraphics[width=0.9\textwidth]{search_path} \vspace{1.5ex} - Der Suchpfad kann sowohl \"uber die in der Abbildung gezeigte GUI - oder auch \"uber die Kommandozeile eingestellt werden. Die GUI - erlaubt Ordner aus dem Suchpfad zu entfernen, neue - Ordner (optional inklusive aller Unterordner) hinzuzuf\"ugen oder - die Reihenfolge der Pfade zu ver\"andern. - - Zum Wechseln des aktuelle Arbeitsverzeichnis wechseln wird das - Kommando \code{cd} verwendet. \code{which} zeigt an, in welchem Pfad - eine bestimmte Funktion gefunden wurde. Das aktuelle - Areitsverzeichnis wird durch den Aufruf \code{pwd} auf der - Kommandozeile ausgegeben. + Der Suchpfad kann sowohl \"uber die Kommandozeile mit dem Kommandos + \code{addpath()} und \code{userpath()} als auch\"uber die in der + Abbildung gezeigte GUI angezeigt und eingestellt werden. Die GUI + erlaubt Ordner aus dem Suchpfad zu entfernen, neue Ordner (optional + inklusive aller Unterordner) hinzuzuf\"ugen oder die Reihenfolge der + Pfade zu ver\"andern. + + Zum Wechseln des aktuellen Arbeitsverzeichnisses wird das Kommando + \code{cd} verwendet. \code{which} zeigt an, in welchem Pfad eine + bestimmte Funktion gefunden wurde. Das aktuelle Areitsverzeichnis + wird durch den Aufruf \code{pwd} auf der Kommandozeile ausgegeben. \end{ibox} \section{Namensgebung von Funktionen und Skripten} \matlab{} sucht Funktionen und Skripte ausschlie{\ss}lich anhand des -Namens. Dabei spielt die Gro{\ss}- und Kleinschreibung eine Rolle. Das -hei{\ss}t, dass die beiden Dateien \file{test\_funktion.m} und -\file{Test\_funktion.m} 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. +Namens. Dabei spielt die Gro{\ss}- und Kleinschreibung eine Rolle. Die +beiden Dateien \file{test\_funktion.m} und \file{Test\_Funktion.m} +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 ein R\"uckschluss auf den Zweck ziehen lassen sollte. +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 @@ -158,8 +159,8 @@ F\"ur die Bennennung von Variablen und Konstanten gelten die gleichen Regeln wie f\"ur die Namen von Funktionen und Skripten. Die Maxime von gutem Programmierstil ist: \emph{``Programmcode muss lesbar sein.''}. Dabei helfen gute Namen ungemein. Auch wenn es schwer -f\"allt passende und nicht zu lange Namen zu finden, sollte einer gute -Namensgebung ernst genommen werden. +f\"allt passende und trotzdem nicht zu lange Namen zu finden, sollte +einer gute Namensgebung sehr ernst genommen werden. W\"ahrend die Namen von Funktionen und Skripten ihren Zweck beschreiben, sollten die Namen von Variablen ihren Inhalt @@ -278,14 +279,17 @@ ein v\"ollig unn\"otiger Kommentar. Bei allen vordefinierten \matlab{} Funktionen findet sich am Anfang eine Kommentarblock, der den Zweck der Funktion, die verschiedenen M\"oglichkeiten des Funktionsaufrufs und die Argumente und -R\"uckgabewerte beschreibt. Auch in eingenen Funktionen sind diese -Kommentare sehr hilfreich. Siehe Listing~\ref{localfunctions} f\"ur -ein Beispiel einer gut Dokumentierten Funktion. +R\"uckgabewerte beschreibt. Mit dem \code{help}- Befehl wird dieser +Kommentarblock angezeigt. Auch in eigenen Funktionen sind +diese Kommentare sehr wichtig. Siehe Listing~\ref{localfunctions} +f\"ur ein Beispiel einer gut dokumentierten Funktion. \begin{important}[Dokumentation von Funktionen] Funktionen m\"ussen unbedingt kommentiert werde! \begin{itemize} \item In wenigen Zeilen kurz den Zweck der Funktion beschreiben. + \item Den Funktionskopf nocheinmal hinschreiben, damit + klar ist, in welcher Reihenfolge Argumente \"ubergeben werden. \item F\"ur jedes Funktionsargument die Bedeutung, der erwartete Datentyp (Zahl, Vektor, Matrix, etc.), und eventuell die Einheit, in der die Zahlen erwartet werden (z.B. Sekunden). @@ -333,7 +337,7 @@ lokale Funktion. \pagebreak[3] \lstinputlisting[label=localfunctions, caption={Beispiel f\"ur den - Einsatz von lokalen Funktionen.}]{calculate_sines.m} + Einsatz von lokalen Funktionen.}]{calculateSines.m} Lokale Funktionen existieren in der gleichen Datei und sind nur dort verf\"ugbar. Jede Funktion hat ihren eigenen G\"ultigkeitsbereich, das @@ -415,6 +419,6 @@ werden. Wenn diese nicht von globalem Interesse sind, kann mit Funktionen} die \"Ubersichtlichkeit erh\"oht werden. \noindent Es lohnt sich auf den eigenen Programmierstil zu -achten!\footnote{Literatur zum Programmierstil: z.B. Robert C. Martin: +achten!\footnote{Buchtip: Robert C. Martin: \textit{Clean Code: A Handbook of Agile Software Craftmanship}, Prentice Hall} diff --git a/regression/lecture/Makefile b/regression/lecture/Makefile index 1f7271d..0347e31 100644 --- a/regression/lecture/Makefile +++ b/regression/lecture/Makefile @@ -1,32 +1,12 @@ BASENAME=regression -PYFILES=$(wildcard *.py) -PYPDFFILES=$(PYFILES:.py=.pdf) - all : pdf -# script: -pdf : $(BASENAME)-chapter.pdf - -$(BASENAME)-chapter.pdf : $(BASENAME)-chapter.tex $(BASENAME).tex $(PYPDFFILES) - CHAPTER=$$(( $$(sed -n -e '/contentsline {chapter}/{s/.*numberline {\([0123456789]*\)}.*/\1/; p}' $(BASENAME).aux) - 1 )); \ - PAGE=$$(sed -n -e '/contentsline {chapter}/{s/.*numberline {.*}.*}{\(.*\)}{chapter.*/\1/; p}' $(BASENAME).aux); \ - sed -i -e "s/setcounter{page}{.*}/setcounter{page}{$$PAGE}/; s/setcounter{chapter}{.*}/setcounter{chapter}{$$CHAPTER}/" $(BASENAME)-chapter.tex - pdflatex -interaction=scrollmode $< | tee /dev/stderr | fgrep -q "Rerun to get cross-references right" && pdflatex -interaction=scrollmode $< || true - -$(PYPDFFILES) : %.pdf : %.py - python $< +include ../../chapter.mk -clean : - rm -f *~ - rm -f $(BASENAME).aux $(BASENAME).log - rm -f $(BASENAME)-chapter.aux $(BASENAME)-chapter.log $(BASENAME)-chapter.out - rm -f $(PYPDFFILES) $(GPTTEXFILES) - -cleanall : clean - rm -f $(BASENAME)-chapter.pdf - -watchpdf : - while true; do ! make -q pdf && make pdf; sleep 0.5; done +# script: +pdf : chapter +clean : cleanchapter +cleanall : clean cleanchapter diff --git a/regression/lecture/regression-chapter.tex b/regression/lecture/regression-chapter.tex index 27ab07c..0c37634 100644 --- a/regression/lecture/regression-chapter.tex +++ b/regression/lecture/regression-chapter.tex @@ -5,8 +5,10 @@ \lstset{inputpath=../code} \graphicspath{{figures/}} -\setcounter{page}{77} -\setcounter{chapter}{5} +\typein[\pagenumber]{Number of first page} +\typein[\chapternumber]{Chapter number} +\setcounter{page}{\pagenumber} +\setcounter{chapter}{\chapternumber} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% diff --git a/statistics/lecture/Makefile b/statistics/lecture/Makefile index 7cc97e2..ab88f11 100644 --- a/statistics/lecture/Makefile +++ b/statistics/lecture/Makefile @@ -1,32 +1,12 @@ BASENAME=statistics -PYFILES=$(wildcard *.py) -PYPDFFILES=$(PYFILES:.py=.pdf) - all : pdf -# script: -pdf : $(BASENAME)-chapter.pdf - -$(BASENAME)-chapter.pdf : $(BASENAME)-chapter.tex $(BASENAME).tex $(PYPDFFILES) ../../header.tex - CHAPTER=$$(( $$(sed -n -e '/contentsline {chapter}/{s/.*numberline {\([0123456789]*\)}.*/\1/; p}' $(BASENAME).aux) - 1 )); \ - PAGE=$$(sed -n -e '/contentsline {chapter}/{s/.*numberline {.*}.*}{\(.*\)}{chapter.*/\1/; p}' $(BASENAME).aux); \ - sed -i -e "s/setcounter{page}{.*}/setcounter{page}{$$PAGE}/; s/setcounter{chapter}{.*}/setcounter{chapter}{$$CHAPTER}/" $(BASENAME)-chapter.tex - pdflatex -interaction=scrollmode $< | tee /dev/stderr | fgrep -q "Rerun to get cross-references right" && pdflatex -interaction=scrollmode $< || true - -$(PYPDFFILES) : %.pdf : %.py - python $< +include ../../chapter.mk -clean : - rm -f *~ - rm -f $(BASENAME).aux $(BASENAME).log - rm -f $(BASENAME)-chapter.aux $(BASENAME)-chapter.log $(BASENAME)-chapter.out - rm -f $(PYPDFFILES) $(GPTTEXFILES) - -cleanall : clean - rm -f $(BASENAME)-chapter.pdf - -watchpdf : - while true; do ! make -q pdf && make pdf; sleep 0.5; done +# script: +pdf : chapter +clean : cleanchapter +cleanall : clean cleanchapter diff --git a/statistics/lecture/statistics-chapter.tex b/statistics/lecture/statistics-chapter.tex index fee3bac..1a87fc8 100644 --- a/statistics/lecture/statistics-chapter.tex +++ b/statistics/lecture/statistics-chapter.tex @@ -5,8 +5,10 @@ \lstset{inputpath=../code} \graphicspath{{figures/}} -\setcounter{page}{57} -\setcounter{chapter}{3} +\typein[\pagenumber]{Number of first page} +\typein[\chapternumber]{Chapter number} +\setcounter{page}{\pagenumber} +\setcounter{chapter}{\chapternumber} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% From 2c389639dc29fffb8661219e3beb6168341773d5 Mon Sep 17 00:00:00 2001 From: Jan Benda Date: Sun, 29 Nov 2015 15:48:15 +0100 Subject: [PATCH 15/17] Improved programming chapter --- chapter.mk | 2 +- header.tex | 16 +- plotting/lecture/plotting-chapter.tex | 8 + pointprocesses/lecture/pointprocessscetch.gpt | 2 +- programming/code/facultyWhileLoop.m | 3 +- programming/code/ifelse.m | 4 +- programming/code/logicalIndexingTime.m | 8 +- programming/code/logicalVector.out | 2 - programming/code/vectorsize.m | 17 +- programming/code/vectorsize.out | 7 +- programming/lecture/programming-chapter.tex | 20 +- programming/lecture/programming.tex | 1269 +++++++++-------- regression/code/errorGradient.m | 3 +- regression/code/lsqGradient.m | 3 - regression/lecture/regression.tex | 2 - 15 files changed, 749 insertions(+), 617 deletions(-) diff --git a/chapter.mk b/chapter.mk index 8a56ed1..8a0e56e 100644 --- a/chapter.mk +++ b/chapter.mk @@ -31,7 +31,7 @@ cleangnuplots : # script: chapter : $(BASENAME)-chapter.pdf -$(BASENAME)-chapter.pdf : $(BASENAME)-chapter.tex $(BASENAME).tex $(wildcard $(BASENAME).aux) $(PYPDFFILES) $(GPTTEXFILES) +$(BASENAME)-chapter.pdf : $(BASENAME)-chapter.tex $(BASENAME).tex $(wildcard $(BASENAME).aux) $(PYPDFFILES) $(GPTTEXFILES) ../../header.tex if test -f $(BASENAME).aux; then \ CHAPTER=$$(( $$(sed -n -e '/contentsline {chapter}/{s/.*numberline {\([0123456789]*\)}.*/\1/; p}' $(BASENAME).aux) - 1 )); \ PAGE=$$(sed -n -e '/contentsline {chapter}/{s/.*numberline {.*}.*}{\(.*\)}{chapter.*/\1/; p}' $(BASENAME).aux); \ diff --git a/header.tex b/header.tex index e13c850..fafdaa5 100644 --- a/header.tex +++ b/header.tex @@ -173,7 +173,7 @@ frame=single, caption={\protect\filename@parse{\lstname}\protect\filename@base}, captionpos=t, - xleftmargin=2.5em, + xleftmargin=21pt, xrightmargin=1mm, aboveskip=1ex, belowskip=2ex @@ -213,7 +213,7 @@ %%%%% code/matlab commands: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \usepackage{textcomp} -\newcommand{\varcode}[1]{\setlength{\fboxsep}{0.5ex}\colorbox{codeback}{\texttt{#1}}} +\newcommand{\varcode}[1]{\setlength{\fboxsep}{0.5ex}\colorbox{codeback}{\texttt{#1\protect\rule[-0.1ex]{0pt}{1.6ex}}}} \newcommand{\code}[2][]{\varcode{#2}\ifthenelse{\equal{#1}{}}{\protect\sindex[code]{#2}}{\protect\sindex[code]{#1}}} \newcommand{\matlab}{\texorpdfstring{MATLAB$^{\copyright}$}{MATLAB}} \newcommand{\matlabfun}[2][]{(\tr{\matlab-function}{\matlab-Funktion} \setlength{\fboxsep}{0.5ex}\colorbox{codeback}{\texttt{#2}})\ifthenelse{\equal{#1}{}}{\protect\sindex[code]{#2}}{\protect\sindex[code]{#1}}} @@ -290,11 +290,13 @@ \newenvironment{ibox}[2][tp] {\SetupFloatingEnvironment{iboxf}{placement=#1}% \begin{iboxf}% - \captionsetup{singlelinecheck=off,labelfont={large,sf,it,bf},font={large,sf,it,bf}} + \captionsetup{singlelinecheck=off,labelfont={large,sf,it,bf},font={large,sf,it,bf}}% \begin{mdframed}[linecolor=infoline,linewidth=1ex,% backgroundcolor=infoback,font={\sffamily},% frametitle={\caption{#2}},frametitleaboveskip=-1ex,% - frametitlebackgroundcolor=infoline]}% + frametitlebackgroundcolor=infoline]% + \setlength{\parindent}{0pt}\setlength{\parskip}{1ex}% + \captionsetup{singlelinecheck=off,labelfont={normalsize,sf,bf},font={normalsize,sf}}}% {\end{mdframed}% \end{iboxf}} @@ -319,11 +321,13 @@ {\captionsetup{singlelinecheck=off,hypcap=false,labelformat={empty},labelfont={large,sf,it,bf},font={large,sf,it,bf}} \ifthenelse{\equal{#1}{}}% {\begin{mdframed}[linecolor=importantline,linewidth=1ex,% - backgroundcolor=importantback,font={\sffamily}]}% + backgroundcolor=importantback,font={\sffamily}]% + \setlength{\parindent}{0pt}\setlength{\parskip}{1ex}}% {\begin{mdframed}[linecolor=importantline,linewidth=1ex,% backgroundcolor=importantback,font={\sffamily},% frametitle={\captionof{iboxf}{#1}},frametitleaboveskip=-1ex,% - frametitlebackgroundcolor=importantline]}% + frametitlebackgroundcolor=importantline]% + \setlength{\parindent}{0pt}\setlength{\parskip}{1ex}}% }% {\end{mdframed}} diff --git a/plotting/lecture/plotting-chapter.tex b/plotting/lecture/plotting-chapter.tex index 7498863..9383d63 100644 --- a/plotting/lecture/plotting-chapter.tex +++ b/plotting/lecture/plotting-chapter.tex @@ -16,5 +16,13 @@ \input{plotting} +\section{TODO} +\begin{itemize} +\item Beispiele schlechter plots sollten mehr Bezug zu den Typen von + plots haben, die wir machen! +\item subplot +\item Uebersicht zu wichtigen plot Befehlen (plot, scatter, bar, step, ...) +\end{itemize} + \end{document} diff --git a/pointprocesses/lecture/pointprocessscetch.gpt b/pointprocesses/lecture/pointprocessscetch.gpt index a758639..4579ff8 100644 --- a/pointprocesses/lecture/pointprocessscetch.gpt +++ b/pointprocesses/lecture/pointprocessscetch.gpt @@ -1,4 +1,4 @@ -set term epslatex size 11.4cm, 7cm +set term epslatex size 11.4cm, 6.5cm set out 'pointprocessscetch.tex' set border 0 diff --git a/programming/code/facultyWhileLoop.m b/programming/code/facultyWhileLoop.m index 8f718d1..f75ff8f 100644 --- a/programming/code/facultyWhileLoop.m +++ b/programming/code/facultyWhileLoop.m @@ -3,5 +3,6 @@ counter = 1; x = 1; while counter <= n x = x * counter; + counter = counter + 1 end -fprintf('Faculty of %i is: %i\n', n, x) \ No newline at end of file +fprintf('Faculty of %i is: %i\n', n, x) diff --git a/programming/code/ifelse.m b/programming/code/ifelse.m index 94de3d6..1d689f4 100644 --- a/programming/code/ifelse.m +++ b/programming/code/ifelse.m @@ -3,18 +3,16 @@ if x < 0.5 disp('x is less than 0.5'); end - if x < 0.5 disp('x is less than 0.5!'); else disp('x is greater than or equal to 0.5!') end - if x < 0.5 disp('x is less than 0.5!'); elseif x < 0.75 disp('x is greater than 0.5 but less than 0.75!'); else disp('x is greater than or equal to 0.75!') -end \ No newline at end of file +end diff --git a/programming/code/logicalIndexingTime.m b/programming/code/logicalIndexingTime.m index 5135f2d..7bde023 100644 --- a/programming/code/logicalIndexingTime.m +++ b/programming/code/logicalIndexingTime.m @@ -1,12 +1,12 @@ t = 0:0.001:10; x = randn(size(t)); -selection = x (t > 5 & t < 6); +selection = x(t > 5 & t < 6); figure() hold on plot(t, x, 'displayname', 'measurements') plot(t(t > 5 & t < 6), selection, 'displayname', 'selection') -xlabel('time [s]') -ylabel('intensity') +xlabel('Time [s]') +ylabel('Intensity') legend 'show' -box 'off' \ No newline at end of file +box 'off' diff --git a/programming/code/logicalVector.out b/programming/code/logicalVector.out index 950933a..14b5afb 100644 --- a/programming/code/logicalVector.out +++ b/programming/code/logicalVector.out @@ -1,12 +1,10 @@ >> logicalVector Logischer Vektor y: - y = 1 1 1 1 0 0 0 0 0 0 Datentyp von y: logical Alle Elemente aus x, die kleiner als 5 sind: - ans = 1 2 3 4 diff --git a/programming/code/vectorsize.m b/programming/code/vectorsize.m index 716a943..6a464f3 100644 --- a/programming/code/vectorsize.m +++ b/programming/code/vectorsize.m @@ -1,14 +1,3 @@ -a = (11:20); % a vector with 10 Elements -fprintf('length of a: %i\n', length(a)) -size_of_a = size(a); % get the size and store it in a new variable - -% size_of_a is a vector itself -fprintf('number of dimensions (rank) of size_of_a: %i\n', length(size_of_a)) - -% get the value of the second element of size_of_a -fprintf('number of entries in the 2nd dimesion of a: %i\n', size_of_a(2)) - -%% Uebersichtliche Alternative? -s = size(a); % Speicher den Rueckgabewert von size() in einer Variablen -s(2) % Inhalt der zweiten Zahl, d.h. Laenge der 2. Dimension -size(a,2) % Kurze Alternative +s = size(a) % Speicher den Rueckgabewert von size() in einer Variablen +s(2) % Inhalt der zweiten Zahl, d.h. Laenge der 2. Dimension +size(a,2) % Die kurze Alternative diff --git a/programming/code/vectorsize.out b/programming/code/vectorsize.out index c848de2..429d61e 100644 --- a/programming/code/vectorsize.out +++ b/programming/code/vectorsize.out @@ -1,4 +1,3 @@ ->> vectorsize -length of a: 10 -number of dimensions (rank) of size_of_a: 2 -number of entries in the 2nd dimesion of a: 10 \ No newline at end of file +s = 1 10 +ans = 10 +ans = 10 diff --git a/programming/lecture/programming-chapter.tex b/programming/lecture/programming-chapter.tex index 62fce49..4ace8b1 100644 --- a/programming/lecture/programming-chapter.tex +++ b/programming/lecture/programming-chapter.tex @@ -7,8 +7,8 @@ \typein[\pagenumber]{Number of first page} \typein[\chapternumber]{Chapter number} -\setcounter{page}{3} -\setcounter{chapter}{0} +\setcounter{page}{\pagenumber} +\setcounter{chapter}{\chapternumber} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -16,5 +16,21 @@ \input{programming} +\section{TODO} +\begin{itemize} +\item Ausgabeformat: \varcode{format} ? +\item Boolescher Ausdruck: ist doch eigentlich boolescher Ausdruck! +\item Expliziter die \varcode{(a:b:c)} Notation einf\"uhren! +\item Mathematische Funktionen sin(), cos(), exp() +\item Rundungsfunktionen round(), floor(), ceil() +\item Zeitvektoren, deltat, Umrechnung Zeit und Index. +\item Matrizen erstmal 2-D und nur kurz n-D +\item Zusammenfassung von Fehlermeldungen bezueglich Matrizen und Vektoren +\item Random-walk behutsam mit einer Schleife, dann zwei Schleifen. Plus Bildchen. +\item Doppelte for-Schleife +\item File output and input (load, save, fprintf, scanf) (extra chapter?) +\item help() und doc() +\end{itemize} + \end{document} diff --git a/programming/lecture/programming.tex b/programming/lecture/programming.tex index b94ab30..f4390fc 100644 --- a/programming/lecture/programming.tex +++ b/programming/lecture/programming.tex @@ -1,15 +1,16 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -\chapter{\tr{Programming basics}{Programmierung in \matlab}} +\chapter{Programmierung in \matlab} \section{Variablen und Datentypen} \subsection{Variablen} -Eine Variable ist ein Zeiger auf eine Stelle im Speicher. Dieser -Zeiger hat einen Namen, den Variablennamen, und einen Datentyp -(Abbildung \ref{variablefig}). Im Speicher wird der Wert der Variablen -bin\"ar gespeichert. Wird auf den Wert der Variable zugegriffen, wird +Eine \determ{Variable} ist ein Zeiger auf eine Stelle im +Speicher. Dieser Zeiger hat einen Namen, den Variablennamen, und einen +\determ{Datentyp} (Abbildung \ref{variablefig}). Im Speicher wird der +Wert der Variablen bin\"ar als eine Folge von \determ[Bit]{Bits} (0 +oder 1) gespeichert. Wird auf den Wert der Variable zugegriffen, wird dieses Bitmuster je nach Datentyp interpretiert. Das Beispiel in Abbildung \ref{variablefig} zeigt, dass das gleiche Bitmuster im einen Fall als 8-Bit Integer Datentyp zur Zahl 38 interpretiert wird und im @@ -39,37 +40,59 @@ befassen. \subsection{Erzeugen von Variablen} In \matlab{} kann eine Variable auf der Kommandozeile, in einem Skript oder einer Funktion an beliebiger Stelle erzeugt werden. Listing -\ref{varListing1} zeigt zwei M\"oglichkeiten dies zu tun: +\ref{varListing1} zeigt drei Beispiele: \begin{lstlisting}[label=varListing1, caption={Erzeugen von Variablen.}] - >> y = [] - y = - [] - >> - >> x = 38 - x = - 38 +>> x = 38 +x = + 38 + +>> y = [] +y = + [] + +>> z = 'A' +z = + A \end{lstlisting} Die Zeile 1 kann etwa so gelesen werden:''Erzeuge eine Variable mit -dem Namen y und weise ihr einen leeren Wert zu''. Das +dem Namen \varcode{x} und weise ihr den Wert 38 zu''. Das Gleichheitszeichen ist der sogenannte -\codeterm{Zuweisungsoperator}. Zeile 5 definiert eine Variable x, der -nun der Zahlenwert 38 zugewiesen wird. Da \matlab{}, wenn nicht anders -angegeben, immer den ``double'' Datentypen benutzt, haben beide -Variablen diesen Datentyp. +\codeterm{Zuweisungsoperator}. Zeile 5 definiert eine Variable \varcode{y}, der +ein leerer Wert zugewiesen wird. Da \matlab{}, wenn nicht anders +angegeben, immer den \codeterm{double} Datentypen benutzt, haben beide +Variablen diesen Datentyp. In Zeile 9 wird der Variablen \varcode{z} der Buchstabe +``A'' zugewiesen. \varcode{z} nicht ein Flie{\ss}kommazahl von Typ \codeterm{double}, +sondern ein \codeterm{character} (Zeichen). + +Der Datentyp einer Variable kann mit \code{class()} abgefragt werden. +Eine Liste aller definierten Variablen gibt \code{who} +zur\"uck. Detailliertere Informationen \"uber Variablen zeigt +\code{whos} an. \begin{lstlisting}[label=varListing2, caption={Erfragen des Datentyps einer Variable, Listen aller definierten Variablen.}] - >>disp(class(x)) - double - >> - >> who % oder whos um mehr Information zu bekommen +>>class(x) +ans = + double + +>> who +Your variables are: + +x y z + +>> whos + Name Size Bytes Class Attributes + + x 1x1 8 double + y 0x0 0 double + z 1x1 2 char \end{lstlisting} \begin{important}[Namen von Variablen] Bei der Namensgebung ist zu beachten, dass \matlab{} auf Gro{\ss}- - und Kleinschreibung achtet und ein Variablennane mit einem - alphabetischen Zeichen beginnen muss. Des Weiteren sind Umlaute, - Sonder- und Leerzeichen in Variablennamen nicht erlaubt. + und Kleinschreibung achtet und ein Variablenname mit einem + alphabetischen Zeichen beginnen muss. Umlaute, Sonder- und + Leerzeichen sind in Variablennamen nicht erlaubt. \end{important} \subsection{Arbeiten mit Variablen} @@ -84,40 +107,39 @@ werden. \matlab{} kennt alle normalen Dachsymbol \code[Operator!arithmetischer!5pow@\^{}]{\^{}} dargestellt. Listing \ref{varListing3} zeigt, wie sie benutzt werden. +\pagebreak[4] \begin{lstlisting}[label=varListing3, caption={Rechnen mit Variablen.}] - >> x = 1; - >> x + 10 - ans = - 11 - >> - >> x % x wurde nicht veraendert - ans = - 1 - >> - >> y = 2; - >> - >> x + y - ans = - 3 - >> - >> z = x + y - z = - 3 - >> - >> z = z * 5; - >> z - z = - 15 - >> - >> clear z +>> x = 1; +>> x + 10 +ans = + 11 +>> x % x wurde nicht veraendert +ans = + 1 + +>> y = 2; +>> x + y +ans = + 3 + +>> z = x + y +z = + 3 + +>> z = z * 5; +>> z +z = + 15 + +>> clear z % loesche die Variable z \end{lstlisting} -Beachtenswert ist z.B. in Zeilen 3 und 6, dass mit dem Inhalt einer +Beachtenswert ist in Zeilen 2 und 6, dass mit dem Inhalt einer Variablen gerechnet werden kann, ohne dass dadurch ihr Wert ver\"andert wird. Wenn der Wert einer Variablen ver\"andert werden -soll, dann muss der Variable der neue Wert explizit zugewiesen werden +soll, dann muss der neue Wert explizit einer Variablen zugewiesen werden (mit dem \code[Operator!Zuweisung!=]{=} Zuweisungsoperator, -z.B. Zeilen 16, 20). Zeile 25 zeigt wie eine einzelne Variable +z.B. Zeilen 14 und 18). Zeile 23 zeigt wie eine einzelne Variable gel\"oscht wird. @@ -126,30 +148,32 @@ gel\"oscht wird. Der Datentyp bestimmt, wie die im Speicher abgelegten Bitmuster interpretiert werden. Die wichtigsten Datentpyen sind: \begin{itemize} -\item \codeterm{integer} - Ganze Zahlen. Hier gibt es mehrere +\item \codeterm{integer}: Ganze Zahlen. Hier gibt es mehrere Unterarten, die wir in \matlab{} (meist) ignorieren k\"onnen. -\item \codeterm{double} - Flie{\ss}kommazahlen. Im Gegensatz zu den reelen Zahlen, die durch diesen Datentyp dargestellt werden, sind sie abz\"ahlbar. -\item \codeterm{complex} - Komplexe Zahlen. -\item \codeterm{logical} - Boolesche Werte, die als wahr +\item \codeterm{double}: Flie{\ss}kommazahlen. Im Gegensatz zu den reelen Zahlen, die durch diesen Datentyp dargestellt werden, sind sie abz\"ahlbar. +\item \codeterm{complex}: Komplexe Zahlen. +\item \codeterm{logical}: Boolesche Werte, die als wahr (\code{true}) oder falsch (\code{false}) interpretiert werden. -\item \codeterm{char} - ASCII Zeichen +\item \codeterm{char}: ASCII Zeichen \end{itemize} Unter den numerischen Datentypen gibt es verschiedene Arten mit -unterschiedlichem Speicherbedarf und Wertebreich. +unterschiedlichem Speicherbedarf und Wertebreich (siehe +Tabelle~\ref{dtypestab}). -\begin{table}[!h] +\begin{table}[t] \centering \titlecaption{Grundlegende numerische Datentypen und ihr Wertebereich.}{} \label{dtypestab} \begin{tabular}{llcl}\hline Datentyp & Speicherbedarf & Wertebereich & Beispiel \erh \\ \hline - double & 64 bit & $\approx -10^{308}$ bis $\approx 10^{308} $& Flie{\ss}kommazahlen.\erb\\ - int & 64 bit & $-2^{31}$ bis $2^{31}-1$ & Ganzzahlige Werte \\ - int16 & 16 bit & $-2^{15}$ bis $2^{15}-1$ & Digitalisierte Spannungen. \\ - uint8 & 8 bit & $0$ bis $255$ & Digitalisierte Imaging Daten. \\ \hline + \code{double} & 64 bit & $\approx -10^{308}$ bis $\approx 10^{308} $& Flie{\ss}kommazahlen.\erb\\ + \code{int} & 64 bit & $-2^{31}$ bis $2^{31}-1$ & Ganzzahlige Werte \\ + \code{int16} & 16 bit & $-2^{15}$ bis $2^{15}-1$ & Digitalisierte Spannungen. \\ + \code{uint8} & 8 bit & $0$ bis $255$ & Digitalisierte Imaging Daten. \\ \hline \end{tabular} \end{table} -\matlab{} arbeitet meist mit dem ``double'' Datentyp wenn numerische + +\matlab{} arbeitet meist mit dem \codeterm{double} Datentyp wenn numerische Daten gespeichert werden. Dennoch lohnt es sich, sich ein wenig mit den Datentypen auseinanderzusetzen (Box \ref{daqbox}). @@ -180,8 +204,8 @@ den Datentypen auseinanderzusetzen (Box \ref{daqbox}). \end{minipage}\vspace{0.25cm} Um Speicherplatz zu sparen ist es sinnvoll, die gemessenen Daten als - ``int16'' anstelle der ``double'' Werte im Rechner abzulegen. Die - Daten als ``echte'' Spannungen, also als Flie{\ss}kommawerte, + \code{int16} anstelle der \code{double} Werte im Rechner abzulegen. Die + Daten als Spannungswerte, also als Flie{\ss}kommawerte, abzulegen ben\"otigt den 4-fachen Speicherplatz (8 statt 2 Bytes) und bietet keine zus\"atzliche Information. \end{ibox} @@ -216,61 +240,69 @@ enth\"alt im Beispiel in Abbildung \ref{vectorfig} vier ganzzahlige Werte. (columnvector).}\label{vectorfig} \end{figure} -Das folgende Listing \ref{arrayListing1} zeigt, wie einfache Vektoren erstellt werden -k\"onnen. - -\begin{lstlisting}[label=arrayListing1, caption={Erstellen einfacher Zeilenvektoren.}] - >> a = [0 1 2 3 4 5 6 7 8 9] % Erstellen eines Zeilenvektors - a = - 0 1 2 3 4 5 6 7 8 9 - >> - >> b = (0:9) % etwas bequemer - b = - 0 1 2 3 4 5 6 7 8 9 - >> - >> c = (0:2:10) - c = - 0 2 4 6 8 10 +Das folgende Listing \ref{generatevectorslisting} zeigt, wie Vektoren erstellt +werden k\"onnen. + +\begin{lstlisting}[label=generatevectorslisting, caption={Erstellen einfacher Zeilenvektoren.}] +>> a = [0 1 2 3 4 5 6 7 8 9] % Erstellen eines Zeilenvektors +a = + 0 1 2 3 4 5 6 7 8 9 + +>> b = (0:9) % etwas bequemer +b = + 0 1 2 3 4 5 6 7 8 9 + +>> c = (0:2:10) +c = + 0 2 4 6 8 10 \end{lstlisting} Die L\"ange eines Vektors, d.h. die Anzahl der Elemente des Vektors, -kann mithilfe der Funktionen \code{length()} und \code{numel()} bestimmt -werden. \"Ahnliche Information kann \"uber die Funktion \code{size()} -erhalten werden (Listing \ref{arrayListing2}). Im Falle des Vektors -\varcode{a} von oben erh\"alt man folgende Ausgabe: - -\begin{lstlisting}[label=arrayListing2, caption={Gr\"o{\ss}e von Vektoren.}] - >> length(a) - ans = - 10 - >> size(a) - ans = - 1 10 +kann mithilfe der Funktionen \code{length()} und \code{numel()} +bestimmt werden. \"Ahnliche Information kann \"uber die Funktion +\code{size()} erhalten werden (Listing \ref{vectorsizeslisting}). Der +Vektor \varcode{a} von oben hat folgende Gr\"o{\ss}en: + +\begin{lstlisting}[label=vectorsizeslisting, caption={Gr\"o{\ss}e von Vektoren.}] +>> length(a) +ans = + 10 + +>> size(a) +ans = + 1 10 \end{lstlisting} -Diese Ausgabe zeigt, dass Vektoren im Grunde 2-dimensional sind. Bei -einem Zeilenvektor hat die erste Dimension die Gr\"o{\ss}e -1. \code[length()]{length(a)} gibt die l\"angste Ausdehnung an. Der \code[Operator!Matrix!']{'}- -Operator transponiert den Spaltenvektor zu einem Zeilenvektor (Zeilen 14 ff.). - - -\begin{lstlisting}[label=arrayListing3, caption={Spaltenvektoren.}] - >> b = [1; 2; 3; 4; 5; 6; 7; 8; 9; 10] % Erstellen eines Spaltenvektors - b = - 1 - 2 - ... - 9 - 10 - >> length(b) - ans = - 10 - >> size(b) - ans = - 10 1 - >> b = b'; % Transponieren - >> size(b) - ans = - 1 10 +Die Ausgabe der \code{size()}-Funktion zeigt, dass Vektoren im Grunde +2-dimensional sind. Bei einem Zeilenvektor hat die erste Dimension die +Gr\"o{\ss}e 1. \code[length()]{length(a)} gibt die l\"angste +Ausdehnung an. Im folgenden Listing \ref{columnvectorlisting} transponiert der +\code[Operator!Matrix!']{'} - Operator einen Spaltenvektor +zu einem Zeilenvektor (Zeilen 14 ff.). + +\begin{lstlisting}[label=columnvectorlisting, caption={Spaltenvektoren.}] +>> b = [1; 2; 3; 4; 5; 6; 7; 8; 9; 10] % Erstellen eines Spaltenvektors +b = + 1 + 2 + ... + 9 + 10 + +>> length(b) +ans = + 10 + +>> size(b) +ans = + 10 1 + +>> b = b' % Transponieren +b = + 1 2 3 4 5 6 7 8 9 10 + +>> size(b) +ans = + 1 10 \end{lstlisting} @@ -278,7 +310,8 @@ Operator transponiert den Spaltenvektor zu einem Zeilenvektor (Zeilen 14 ff.). \begin{figure} \includegraphics[width=0.4\columnwidth]{arrayIndexing} \titlecaption{Indices von Vektoren.}{Jedes Feld eines Vektors hat - einen Index mit dem auf den jeweiligen Inhalt zugegriffen werden + einen Index (kleine Zahl) mit dem auf den jeweiligen Inhalt + (gro{\ss}e Zahl) zugegriffen werden kann.}\label{vectorindexingfig} \end{figure} @@ -287,158 +320,242 @@ Der Zugriff auf die Inhalte eines Vektors erfolgt \"uber den Index einen fortlaufenden \codeterm{Index}, \"uber den auf die Werte des Vektors zugegriffen werden kann. Dabei spielt es keine Rolle, ob es sich um einen Zeilen- oder Spaltenvektor handelt. + \begin{important}[Indizieren] - Anders als viele andere Programmiersprachen beginnt \matlab{} mit - dem Index 1 an zu z\"ahlen. Der Zugriff auf Inhalte eines Vektors - mittels seines Indexes wird Indizieren genannnt. + Der Zugriff auf Inhalte eines Vektors mittels seines Indexes wird + Indizieren genannnt. + + Der Index des ersten Elements eines Vektors ist in \matlab{} die Eins. + + Der Index des letzten Elements entspricht der L\"ange des Vektors. \end{important} -Die Listings \ref{arrayListing4} und \ref{arrayListing5} zeigen wie + +Die Listings \ref{vectorelementslisting} und \ref{vectorrangelisting} zeigen wie mit Indexen auf die Inhalte eines Vektors zugegriffen werden kann. +Hierbei kann auf einzelne Werte zugegriffen werden oder, analog zur +Erzeugung von Vektoren, die \code[Operator!Matrix!:]{:} Notation +verwendet werden, um auf mehrere Element gleichzeitig zuzugreifen. -\begin{lstlisting}[label=arrayListing4, caption={Zugriff auf den Inhalt von Vektoren: einzelne Elemente}] - >> a = (11:20) - a = 11 12 13 14 15 16 17 18 19 20 - >> a(1) % das 1. Element - ans = 11 - >> a(5) % das 5. Element - ans = 15 - >> a(end) % das letzte Element - ans = 20 +\begin{lstlisting}[label=vectorelementslisting, caption={Zugriff auf den Inhalt von Vektoren: einzelne Elemente}] +>> a = (11:20) +a = + 11 12 13 14 15 16 17 18 19 20 + +>> a(1) % das 1. Element +ans = 11 + +>> a(5) % das 5. Element +ans = 15 + +>> a(end) % das letzte Element +ans = 20 \end{lstlisting} -Hierbei kann auf einzelne Werte zugegriffen werden oder, analog zur -Erzeugung von Vektoren, die \code[Operator!Matrix!:]{:} Notation verwendet werden, um auf mehrere -Element gleichzeitig zuzugreifen. - -\begin{lstlisting}[caption={Zugriff auf den Inhalt von Vektoren: Bereiche}, label=arrayListing5] - >> a([1 3 5]) % das 1., 3. und 5. Element - ans = - 11 13 15 - >> a(2:4) % alle Elemente von Index 2 bis einschliesslich 4 - ans = - 12 13 14 - >> a(1:2:end) % jedes zweite Element - ans = - 11 13 15 17 19 - >> a(:) % alle Elemente - ans = - 11 12 13 14 15 16 17 18 19 20 +\begin{lstlisting}[caption={Zugriff auf den Inhalt von Vektoren: Bereiche}, label=vectorrangelisting] +>> a([1 3 5]) % das 1., 3. und 5. Element +ans = + 11 13 15 + +>> a(2:4) % alle Elemente von Index 2 bis einschliesslich 4 +ans = + 12 13 14 + +>> a(1:2:end) % jedes zweite Element +ans = + 11 13 15 17 19 + +>> a(:) % alle Elemente als Zeilenvektor +ans = + 11 12 13 14 15 16 17 18 19 20 \end{lstlisting} \begin{exercise}{vectorsize.m}{vectorsize.out} Der R\"uckgabewert von \code[size()]{size(a)} ist wieder ein Vektor der - L\"ange 2. Wie k\"onnte man also die Gr\"o{\ss}e von \varcode{a} in der - zweiten Dimension herausfinden? + L\"ange 2. Wie k\"onnte also die Gr\"o{\ss}e von \varcode{a} in der + zweiten Dimension herausgefunden werden? \end{exercise} \subsubsection{Operationen auf Vektoren} Mit Vektoren kann sehr einfach gerechnet werden. Listing -\ref{arrayListing6} zeigt Rechnungen mit Vektoren. - -\begin{lstlisting}[caption={Rechnen mit Vektoren.},label=arrayListing6] - >> a = (0:2:8); - >> a + 5 % addiere einen Skalar - ans = - 5 7 9 11 13 - - >> a - 5 % subtrahiere einen Skalar - ans = - -5 -3 -1 1 3 - - >> a .* 2 % Multiplikation - ans = - 0 4 8 12 16 - - >> a ./ 2 % Division - ans = - 0 1 2 3 4 - - >> a(1:3) + a(2:4) % Addieren von 2 Vektoren - ans = - 2 6 10 - >> - >> a(1:2) + a(2:4) % Vektoren muessen gleich gross sein! - ??? Error using ==> plus - Matrix dimensions must agree. +\ref{vectorscalarlisting} zeigt die Verrechnung von Vektoren mit Skalaren +mit den Operatoren \code[Operator!arithmetischer!1add@+]{+}, +\code[Operator!arithmetischer!2sub@-]{-}, +\code[Operator!arithmetischer!3mul@*]{*}, +\code[Operator!arithmetischer!4div@/]{/} +\code[Operator!arithmetischer!5pow@.\^{}]{.\^}. + +\begin{lstlisting}[caption={Rechnen mit Vektoren und Skalaren.},label=vectorscalarlisting] +>> a = (0:2:8) +a = + 0 2 4 6 8 + +>> a + 5 % Addition von einem Skalar +ans = + 5 7 9 11 13 + +>> a - 5 % Subtraktion von einem Skalar +ans = + -5 -3 -1 1 3 + +>> a * 2 % Multiplikation mit einem Skalar +ans = + 0 4 8 12 16 + +>> a / 2 % Division mit einem Skalar +ans = + 0 1 2 3 4 + +>> a .^ 2 % Potenzierung mit einem Skalar +ans = + 0 4 16 36 64 \end{lstlisting} -Wird ein Vektor mit einem skalaren Wert verrechnet, dann ist das -problemlos m\"oglich. Bei der Multiplikation (Zeile 10), der Division -(Zeile 14) und auch der Potenzierung mu{\ss} mit vorangestellem '.' -klar gemacht werden, dass es sich um eine \emph{elementweise} -Verarbeitung handeln soll. F\"ur diese elementweisen Operationen kennt -\matlab{} die Operatoren \code[Operator!arithmetischer!3mule@.*]{.*}, +Bei der elementweisen Verrechnung von zwei Vektoren muss +sichergestellt werden, dass sie die gleiche L\"ange und das gleiche +Layout (Spalten- oder Zeilenvektor) haben. Addition und Subtraktion +erfolgt immer elementweise (Listing~\ref{vectoradditionlisting}). + +\begin{lstlisting}[caption={Elementweise Addition und Subtraktion von + Vektoren.},label=vectoradditionlisting] +>> a = [4 9 12]; +>> b = [4 3 2]; +>> a + b % Addition von 2 Vektoren +ans = + 8 12 14 + +>> a - b % Subtraktion von 2 Vektoren +ans = + 0 6 10 + +>> c = [8 4]; +>> a + c % Beide Vektoren muessen gleich gross sein! +Error using + +Matrix dimensions must agree. +>> d = [8; 4; 2]; +>> a + d % Beide Vektoren muessen das gleiche Layout haben! +Error using + +Matrix dimensions must agree. +\end{lstlisting} + +Bei der Multiplikation, der Division und der Potenzierung mu{\ss} mit +vorangestellem '.' angezeigt werden, dass es sich um eine +\emph{elementweise} Verarbeitung handeln soll. F\"ur diese +elementweisen Operationen kennt \matlab{} die Operatoren +\code[Operator!arithmetischer!3mule@.*]{.*}, \code[Operator!arithmetischer!4dive@./]{./} und -\code[Operator!arithmetischer!5powe@.\^{}]{.\^{}}. Die einfachen Operatoren -\code[Operator!arithmetischer!3mul@*]{*}, -\code[Operator!arithmetischer!4div@/]{/} und -\code[Operator!arithmetischer!5pow@\^{}]{\^{}} sind mit den entsprechenden -Matrixoperationen aus der linearen Algebrar belegt (Box -\ref{matrixmultiplication}). +\code[Operator!arithmetischer!5powe@.\^{}]{.\^{}} +(Listing~\ref{vectorelemmultiplicationlisting}). -Zu Beachten ist des Weiteren noch die Fehlermeldung am Schluss von -Listing \ref{arrayListing6}. Wenn zwei Vektoren (elementweise) -miteinander verrechnet werden sollen, muss nicht nur die Anzahl der Elemente -\"ubereinstimmen, sondern es muss auch das Layout (Zeilen- oder -Spaltenvektoren) \"ubereinstimmen. +\begin{lstlisting}[caption={Elementweise Multiplikation, Division und + Potenzierung von Vektoren.},label=vectorelemmultiplicationlisting] +>> a .* b % Elementweise Multiplikation +ans = + 16 27 24 +>> a ./ b % Elementweise Division +ans = + 1 3 6 -Will man Elemente aus einem Vektor entfernen, dann weist man den -entsprechenden Zellen einen leeren Wert (\code[Operator!Matrix!{[]}]{[]}) zu. +>> a ./ b % Elementweise Potenzierung +ans = + 256 729 144 + +>> a .* c % Beide Vektoren muessen gleich gross sein! +Error using .* +Matrix dimensions must agree. +>> a .* d % Beide Vektoren muessen das gleiche Layout haben! +Error using .* +Matrix dimensions must agree. +\end{lstlisting} -\begin{lstlisting}[label=arrayListing7, caption={L\"oschen von Elementen aus einem Vektor.}] - >> a = (0:2:8); - >> length(a) - ans = - 5 +Die einfachen Operatoren \code[Operator!arithmetischer!3mul@*]{*}, +\code[Operator!arithmetischer!4div@/]{/} und +\code[Operator!arithmetischer!5pow@\^{}]{\^{}} sind mit den +entsprechenden Matrixoperationen aus der linearen Algebrar belegt (Box +\ref{matrixmultiplication}). Insbesondere ist die Multiplikation eines +Zeilenvektors $\vec a$ mit einem Spaltenvektor $\vec b$ das Skalarprodukt +$\sum_i = a_i b_i$. + +\begin{lstlisting}[caption={Multiplikation von Vektoren.},label=vectormultiplicationlisting] +>> a * b % Multiplikation zweier Zeilenvektoren +Error using * +Inner matrix dimensions must agree. +>> a' * b' % Multiplikation zweier Spaltenvektoren +Error using * +Inner matrix dimensions must agree. + +>> a * b' % Multiplikation Zeilenvektor mit Spaltenvektor +ans = + 67 - >> a(1) = [] % loesche das erste Element - a = 2 4 6 8 +>> a' * b % Multiplikation Spaltenvektor mit Zeilenvektor +ans = + 16 12 8 + 36 27 18 + 48 36 24 +\end{lstlisting} + +\pagebreak[4] +Zum Entfernen von Elementen aus einem Vektor, wird den +entsprechenden Zellen ein leeren Wert (\code[Operator!Matrix!{[]}]{[]}) zugewiesen: +\begin{lstlisting}[label=vectoreraselisting, caption={L\"oschen von Elementen aus einem Vektor.}] +>> a = (0:2:8); +>> length(a) +ans = 5 - >> a([1 3]) = [] - a = 4 8 +>> a(1) = [] % loesche das erste Element +a = 2 4 6 8 - >> length(a) - ans = - 2 +>> a([1 3]) = [] % loesche das erste und dritte Element +a = 4 8 + +>> length(a) +ans = 2 \end{lstlisting} Neben dem L\"oschen von Vektorinhalten k\"onnen Vektoren auch -erweitert oder zusammengesetzt werden. Auch hier muss das Layout der Vektoren -\"ubereinstimmen (Listing \ref{arrayListing8}, Zeile 12). Will man -einen Vektor erweitern, kann man \"uber das Ende hinaus -zuweisen. \matlab{} erweitert dann die Variable. Dieser Vorgang ist -``rechenintensiv'' und sollte, soweit m\"oglich, vermieden werden. - -\begin{lstlisting}[caption={Zusammenf\"ugen und Erweitern von Vektoren.}, label=arrayListing8] - >> a = (0:2:8); - >> b = (10:2:19); - >> c = [a b] % erstelle einen Vektor aus einer Liste von Vektoren - c = - 0 2 4 6 8 10 12 14 16 18 - >> length(c) - ans = - 10 - >> length(a) + length(b) - ans = - 10 - >> c = [a b']; - Error using horzcat - Dimensions of matrices being concatenated are not consistent. - - >> b(6:8) = [1 2 3 4]; - In an assignment A(:) = B, the number of elements in A and B must be the same. +erweitert oder zusammengesetzt werden. Auch hier muss das Layout der +Vektoren \"ubereinstimmen (Listing \ref{vectorinsertlisting}, Zeile +10). Zum Erweitern eines Vektors kann \"uber das Ende hinaus +zugewiesen werden (Zeile 20). \matlab{} erweitert dann die Variable +entsprechend. Dieser Vorgang ist rechenintensiv da der ganze Vektor +an eine neue Stelle im Arbeitsspeicher kopiert wird und sollte, soweit +m\"oglich, vermieden werden. + +\begin{lstlisting}[caption={Zusammenf\"ugen und Erweitern von Vektoren.}, label=vectorinsertlisting] +>> a = [4 3 2 1]; +>> b = [10 12 14 16]; +>> c = [a b] % erstelle einen Vektor aus einer Liste von Vektoren +c = + 4 3 2 1 10 12 14 16 +>> length(c) +ans = 8 +>> length(a) + length(b) +ans = 8 +>> c = [a b']; % Vektorlayout muss uebereinstimmen +Error using horzcat +Dimensions of matrices being concatenated are not consistent. + +>> a(1:3) = [5 6 7] % Weise den ersten drei Elementen neue Werte zu +a = + 5 6 7 1 +>> a(1:3) = [1 2 3 4]; % Laenge der Vektoren muss uebereinstimmen +In an assignment A(I) = B, the number of elements in B and I must be the same. + +>> a(3:6) = [1 2 3 4] % Zuweisung ueber die Laenge des Vektors hinweg +a = + 5 6 1 2 3 4 \end{lstlisting} \subsection{Matrizen} -Im Gegesatz zu den 1-dimensionalen Vektoren k\"onnen Martizen -n-dimensional sein, das hei{\ss}t, dass sie beliebig viele Dimensionen -haben k\"onnen. Von praktischer Bedeutung sind allerdings nur Matrizen -mit bis zu vier Dimensionen. Meist beschr\"ankt es sich jedoch auf 2- -bis 3-d Matrizen (Abbildung \ref{matrixfig} A,B). +Vektoren sind 1-dimensionale Spezialf\"alle von $n$-dimensionalen +Matrizen. Matrizen k\"onnen in \matlab{} beliebig viele Dimensionen +haben. Von praktischer Bedeutung sind allerdings nur Matrizen mit bis +zu vier Dimensionen. Meist beschr\"ankt es sich jedoch auf 2- bis 3-d +Matrizen (Abbildung \ref{matrixfig} A,B). \begin{figure} \includegraphics[width=0.5\columnwidth]{matrices} @@ -451,41 +568,37 @@ bis 3-d Matrizen (Abbildung \ref{matrixfig} A,B). Erzeugt werden Matrizen sehr \"ahnlich zu den Vektoren (Listing \ref{matrixListing}). Die Definition einer Matrize wird, wie beim Vektor, durch \code[Operator!Matrix!{[]}]{[]} eingeschlossen. Das -\code[Operator!Matrix!;]{;} trennt die einzelnen Zeilen der +Semikolon \code[Operator!Matrix!;]{;} trennt die einzelnen Zeilen der Matrize. \begin{lstlisting}[label=matrixListing, caption={Erzeugen von Matrizen.}] - >> a = [1 2 3; 4 5 6; 7 8 9] - >> a = - 1 2 3 - 4 5 6 - 7 8 9 - >> - >> b = ones(3,3,2); - >> b - - b(:,:,1) = - 1 1 1 - 1 1 1 - 1 1 1 - - b(:,:,2) = - 1 1 1 - 1 1 1 - 1 1 1 +>> a = [1 2 3; 4 5 6; 7 8 9] +>> a = +1 2 3 +4 5 6 +7 8 9 + +>> b = ones(3, 4, 2) +b(:,:,1) = + 1 1 1 1 + 1 1 1 1 + 1 1 1 1 +b(:,:,2) = + 1 1 1 1 + 1 1 1 1 + 1 1 1 1 \end{lstlisting} Zur Defintion von mehr-dimensionalen Matrizen ist die Notation in Zeile 1 nicht geeignet. Es gibt allerdings eine Reihe von -Helferfunktionen, die n-dimensionale Matrizen erstellen k\"onnen -(z.B. \code{ones()}, Zeile 7). Sollte sich die Notwendigkeit ergeben -mehrdimensionale Matrizen zusammenzuf\"ugen hilft die \code{cat()} -Funktion. +Helferfunktionen, die $n$-dimensionale Matrizen erstellen k\"onnen +(z.B. \code{ones()}, Zeile 7). Die \code{cat()}-Funktion kann +mehrdimensionale Matrizen zusammenzuf\"ugen. Um Informationen \"uber die Gr\"o{\ss}e einer Matrize zu bekommen ist die Funktion \code{length()} nicht geeignet. Wie oben erw\"ahnt gibt sie -die Gr\"o{\ss}e der l\"angsten Dimension aus. Wann immer es um -Matrizen geht, wird \code{size()} benutzt. +die Gr\"o{\ss}e der l\"angsten Dimension aus. Die \code{size()}-Funktion +gibt dagegen die L\"ange jeder Dimension als Vektor zur\"uck. \begin{figure} \includegraphics[width=0.9\columnwidth]{matrixIndexing} @@ -503,40 +616,46 @@ Der Zugriff auf Inhalte von Matrizen erfolgt \"uber den Index Koordinatensystem wird jede Zelle einer Matrize mit einem Index angesprochen, der aus $n$ Zahlen besteht wobei $n$ die Dimensionalit\"at der Matrize ist. Diese Art des Zugriffs wird -\codeterm{subscript indexing} genannt. +\codeterm{subscript indexing} genannt. Dabei bestimmt die errste Zahl +die Zeilennumer, die zweite die Splatennumer. \begin{lstlisting}[caption={Zugriff auf Inhalte von Matrizen, Indizierung.}, label=matrixIndexing] - >> x = randi(100, [3, 4, 5]); % 3-D Matrix mit Zufallszahlen - >> size(x) - ans = - 3 4 5 - >> x(1,1,1); % obere linke Ecke - ans(1,1,1) = - 14 - >> - >> x(1,1,:) % obere linke Ecke entlang der 3. Dimension - ans(1,1,:) = - 14 - ans(:,:,2) = - 58 - ans(:,:,3) = - 4 - ans(:,:,4) = - 93 - ans(:,:,5) = - 56 +>> x=rand(3,4) % 2-D Matrix mit Zufallszahlen mit 3 Zeilen und 4 Spalten +x = + 0.8147 0.9134 0.2785 0.9649 + 0.9058 0.6324 0.5469 0.1576 + 0.1270 0.0975 0.9575 0.9706 +>> size(x) +ans = + 3 4 + +>> x(1,1) % obere linke Ecke +ans = + 0.8147 +>> x(2,3) % Element der 2. Zeile, 3. Spalte +ans = + 0.5469 + +>> x(1,:) % erste Zeile +ans = + 0.8147 0.9134 0.2785 0.9649 +>> x(:,2) % zweite Spalte +ans = + 0.9134 + 0.6324 + 0.0975 \end{lstlisting} Alternativ zum \codeterm{subscript indexing} k\"onnen die Zellen einer Matrize auch \emph{linear} angesprochen werden (Abbildung \ref{matrixlinearindexingfig}). Diese Art der Adressierung ist nicht -so intuitiv verst\"andlich, kann aber sehr hilfreich sein. Der -``linare'' Index einer Zelle reicht von 1 bis \code[numel()]{numel(M)} -Elemente. Wobei dieser erst entlang der 1. Dimension, dann der 2., -3. etc. Dimension ansteigt. Listing \ref{matrixLinearIndexing} zeigt -ein Beispiel f\"ur den Einsatz des linearen Indizierens z.B. wenn man -den Minimalwert aller Elemente einer Matrize ermitteln m\"ochte. +so intuitiv verst\"andlich, kann aber sehr hilfreich sein. Der lineare +Index einer Zelle reicht von 1 bis \code{numel()} Elemente. Wobei +dieser erst entlang der 1. Dimension, dann der 2., 3. etc. Dimension +ansteigt. Listing \ref{matrixLinearIndexing} zeigt ein Beispiel f\"ur +den Einsatz des linearen Indizierens, z.B. zum Ermitteln des kleinsten +Wertes in einer Matrize. \begin{figure} \includegraphics[width=0.9\columnwidth]{matrixLinearIndexing} @@ -547,99 +666,99 @@ den Minimalwert aller Elemente einer Matrize ermitteln m\"ochte. \end{figure} \begin{lstlisting}[label=matrixLinearIndexing, caption={Lineares Indizieren in Matrizen.}] - >> x = randi(100, [3, 4, 5]); % 3-D Matrix mit Zufallszahlen - >> size(x) - ans = - 3 4 5 - >> numel(x) - ans = - 60 - >> min(min(min(x))) % Minumum uber die Zeilen, Spalten, Blaetter... - ans = - 4 - >> min(x(:)) % oder so - ans = - 4 +>> x = randi(100, [3, 4, 5]); % 3-D Matrix mit Zufallszahlen +>> size(x) +ans = +3 4 5 +>> numel(x) +ans = +60 +>> min(min(min(x))) % Minimum ueber die Zeilen, Spalten, Blaetter... +ans = +4 +>> min(x(:)) % oder so +ans = +4 \end{lstlisting} +\begin{ibox}[t]{\label{matrixmultiplication} Matrixmultiplikation.} + Die Matrixmuliplikation aus der linearen Algebra ist nicht eine + elementweise Multiplikation. Die Matrixmultiplikation ist nur dann + m\"oglich, wenn die Anzahl Spalten der ersten Matrize gleich der + Anzahl Zeilen in der zweiten Matrize ist. Formaler: zwei Matrizen + $\mathbf{A}$ und $\mathbf{B}$ k\"onnen mulipiziert $(\mathbf{A} + \cdot \mathbf{B})$ werden, wenn $\mathbf{A}$ die Gr\"o{\ss}e $(m \times n)$ und + $\mathbf{B}$ die Gr\"o{\ss}e $(n \times k)$ hat. Die Mulitplikation ist + m\"oglich wenn die \determ{inneren Dimensionen} $n$ gleich sind. + + Dann sind die Elemente $c_{i,j}$ des Matrixprodukts $\mathbf{C} = + \mathbf{A} \cdot \mathbf{B}$ gegeben durch das Skalarprodukt jeder + Zeile von $\mathbf{A}$ mit jeder Spalte aus $\mathbf{B}$: + \[ c_{i,j} = \sum_{k=1}^n a_{i,k} \; b_{k,j} \; . \] + + Die Matrixmultiplikation ist im Allgemeinen auch nicht kommutativ: + \[ \mathbf{A} \cdot \mathbf{B} \ne \mathbf{B} \cdot \mathbf{A} \; . \] + + Als Beispiel betrachten wir die beiden Matrizen + \[\mathbf{A}_{(3 \times 2)} = \begin{pmatrix} 1 & 2 \\ 5 & 4 \\ -2 & 3 \end{pmatrix} + \quad \text{und} \quad \mathbf{B}_{(2 \times 2)} = \begin{pmatrix} + -1 & 2 \\ -2 & 5 \end{pmatrix} \; . \] + F\"ur das Produkt $\mathbf{A} \cdot \mathbf{B}$ stimmen die inneren + Dimensionen der Matrizen \"uberein ($(3 \times 2) \cdot (2 + \times 2)$), die Matrixmultiplikation ist also m\"oglich. Nachdem + $\mathbf{A}$ drei Zeilen und $\mathbf{B}$ zwei Spalten hat, hat das + Ergebnis von $\mathbf{A} \cdot \mathbf{B}$ die Gr\"o{\ss}e $(3 + \times 2)$: + \[ \mathbf{A} \cdot \mathbf{B} = \begin{pmatrix} 1 \cdot -1 + 2 \cdot -2 & 1 \cdot 2 + 2\cdot 5 \\ + 5 \cdot -1 + 4 \cdot -2 & 5 \cdot 2 + 4 \cdot 5\\ + -2 \cdot -1 + 3 \cdot -2 & -2 \cdot 2 + 3 \cdot 5 \end{pmatrix} + = \begin{pmatrix} -5 & 12 \\ -13 & 30 \\ -4 & 11\end{pmatrix} \; . \] + + Das Produkt $\mathbf{B} \cdot \mathbf{A}$ ist dagegen nicht + definiert, da die inneren Dimensionen nicht \"ubereinstimmen + ($(2 \times 2) \cdot (3 \times 2)$). +\end{ibox} Beim Rechnen mit Matrizen gelten die gleichen Regeln wie bei Vektoren. Matrizen k\"onnen solange elementweise miteinander verrechnet werden, wie die Dimensionalit\"aten -\"ubereinstimmen. Besondere Vorsicht sollte man immer dann walten -lassen, wenn man Matrizen miteinander multiplizieren, dividieren oder -potenzieren will. Hier ist es wichtig sich klarzumachen was man will: -Eine elementweise Multiplikation +\"ubereinstimmen. Wichtig ist auch hier wieder die Unterscheidung +zwischen elementweiser Multiplikation (\code[Operator!arithmetischer!3mule@.*]{.*} Operator, Listing -\ref{matrixOperations} Zeile 18) oder ob eine Matrixmultiplikation +\ref{matrixOperations} Zeile 10) oder Matrixmultiplikation (\code[Operator!arithmetischer!3mul@*]{*} Operator, Listing -\ref{matrixOperations} Zeile 12, Box \ref{matrixmultiplication}) -durchgef\"uhrt werden soll. +\ref{matrixOperations} Zeile 14, 17 und 21, Box~\ref{matrixmultiplication}). +Bei der Matrixmultiplikation m\"ussen die inneren Dimensionen der Matrizen \"ubereinstimmen +(Box~\ref{matrixmultiplication}). +\pagebreak[4] \begin{lstlisting}[label=matrixOperations, caption={Zwei Arten der Multiplikation von Matrizen.}] - >> A = randi(10, [3, 3]) % 2-D Matrix - A = - 3 8 2 - 2 10 3 - 10 7 1 - >> B = randi(10, [3, 3]) % dto - B = - 2 1 7 - 1 5 9 - 5 10 5 - >> - >> A * B % Matrixmultiplikation - ans = - 24 63 103 - 29 82 119 - 32 55 138 - >> - >> A .* B % Elementweise Multiplikation - ans = - 6 8 14 - 2 50 27 - 50 70 5 -\end{lstlisting} - -\begin{ibox}[t]{\label{matrixmultiplication} Matrixmultiplikation.} - Die Matrixmuliplikation aus der linearen Algebra ist nicht eine - elementweise Multiplikation. Die Matrixmultiplikation ist nur - dann m\"oglich, wenn die Anzahl Spalten der ersten Matrize gleich - der Anzahl Zeilen in der zweiten Matrize ist. Formaler: zwei - Matrizen A, B k\"onnen mulipiziert $(A \cdot B)$ werden, wenn A die - Gr\"o{\ss}e $(m \times n)$ und B die Gr\"o{\ss}e $(n \times k)$ - hat. Die Mulitplikation ist m\"oglich wenn die ``inneren'' - Dimensionen $n$ gleich sind. Daraus - erkl\"art sich auch die folgende Fehlermeldung in \matlab{}: - \begin{lstlisting}[caption={Fehlermeldung bei Matrixmultiplikation}] ->> A = [1 2 3; 4 5 6]; ->> B = [2 4; 6 7]; ->> A * B +>> A = randi(5, [2, 3]) % 2-D Matrix +A = + 1 5 3 + 3 2 2 +>> B = randi(5, [2, 3]) % dito +B = + 4 3 5 + 2 4 5 + +>> A .* B % elementweise Multiplikation +ans = + 4 15 15 + 6 8 10 +>> A * B % Matrixmultiplikation Error using * -Inner matrix dimensions must agree. ->> size(A) +Inner matrix dimensions must agree. +>> A * B' % Matrixmultiplikation ans = - 2 3 ->> size(B) -ans = - 2 2 - \end{lstlisting} - - Als Beispiel betrachten wir die beiden Matrizen - \[A_{(3 \times 2)} = \begin{pmatrix} 1 & 2 \\ 5 & 4 \\ -2 & 3 \end{pmatrix} - \quad \text{und} \quad - B_{(2 \times 2)} = \begin{pmatrix} -1 & 2 \\ -2 & 5 \end{pmatrix} \; . \] - Die ``inneren'' Dimensionen der Matrizen stimmen \"uberein ($(3 - \times 2) \cdot (2 \times 2)$), die Matrixmultiplikation ist - also m\"oglich. Das Produkt wird aus dem Skalarprodukt - jeder Zeile von $A$ mit jeder Spalte aus $B$ berechnet. Nachdem - $A$ drei Zeilen und $B$ zwei Spalten hat, hat das Ergebnis von $A - \cdot B$ die Gr\"o{\ss}e $(3 \times 2)$: - \[A \cdot B = \begin{pmatrix} 1 \cdot -1 + 2 \cdot -2 & 1 \cdot 2 + 2\cdot 5 \\ - 5 \cdot -1 + 4 \cdot -2 & 5 \cdot 2 + 4 \cdot 5\\ - -2 \cdot -1 + 3 \cdot -2 & -2 \cdot 2 + 3 \cdot 5 \end{pmatrix} - = \begin{pmatrix} -5 & 12 \\ -13 & 30 \\ -4 & 11\end{pmatrix} \; . \] -\end{ibox} + 34 37 + 28 24 +>> A' * B % Matrixmultiplikation +ans = + 10 15 20 + 24 23 35 + 16 17 25 +\end{lstlisting} \section{Boolesche Operationen} @@ -654,99 +773,92 @@ Beziehung zwischen Entit\"aten zu testen. Hierzu werden die gleich und nicht) eingesetzt. Mehrere Ausdr\"ucke werden mittels der \codeterm[Operator!logischer]{logischen Operatoren} (\code[Operator!logischer!and1@\&]{\&}, \code[Operator!logischer!or1@{"|} {}]{|}, -UND, ODER ) verkn\"upft. Sie sind f\"ur uns nicht nur wichtig um +UND, ODER) verkn\"upft. Sie sind nicht nur wichtig, um Codeabschnitte bedingt auszuf\"uhren (Verzweigungen, \ref{controlstructsec}) sondern auch um aus Vektoren und Matrizen bequem Elemente auszuw\"ahlen (logisches Indizieren, -\ref{logicalindexingsec}). Die Tabellen \ref{logicalandor} zeigen die -Wahrheitstabellen f\"ur das logische UND (Tabelle \ref{logicalandor}, -links) und das logische ODER (Tabelle \ref{logicalandor}, rechts). Es -werden die Aussagen A und B mit dem Operator verkn\"upft. Beim -logischen UND ist der gesamte Ausdruck nur dann wahr, wenn beide -Ausdr\"ucke sich zu wahr auswerten lassen. +\ref{logicalindexingsec}). + +Die Tabellen \ref{logicalandor} zeigen die Wahrheitstabellen f\"ur das +logische UND, das logische ODER und das logische XOR +(entweder-oder). Es werden die Aussagen A und B mit dem Operator +verkn\"upft. Beim logischen UND ist der gesamte Ausdruck nur dann +wahr, wenn beide Ausdr\"ucke sich zu wahr auswerten lassen. Anders +ist das beim logischen ODER. Hier ist der gesamte Ausdruck wahr, wenn +sich der eine \emph{oder} der andere Ausdruck, oder beide Ausdr\"ucke +zu wahr auswerten lassen. Das auschlie{\ss}ende ODER (XOR) ist nur +wahr, wenn entweder der eine oder der andere Ausdruck wahr ist und ist +in \matlab{} als Funktion \code[xor()]{xor(A, B)} verf\"ugbar. \begin{table}[tp] - \titlecaption{Wahrheitstabellen logisches UND (links) und logisches ODER (rechts).}{}\label{logicalandor} + \titlecaption{Wahrheitstabellen logisches UND, ODER und XOR.}{}\label{logicalandor} \begin{tabular}{llll} \multicolumn{2}{l}{\multirow{2}{*}{}} & \multicolumn{2}{c}{\textbf{B}} \\ - \multicolumn{2}{l}{} & \multicolumn{1}{|c}{wahr} & falsch \\ \cline{2-4} + & \sffamily{\textbf{und}} & \multicolumn{1}{|c}{wahr} & falsch \\ \cline{2-4} \multirow{2}{*}{\textbf{A}} & \multicolumn{1}{l|}{wahr} & \multicolumn{1}{c}{\textcolor{mygreen}{wahr}} & \textcolor{red}{falsch} \erb \\ & \multicolumn{1}{l|}{falsch} & \multicolumn{1}{l}{\textcolor{red}{falsch}} & \textcolor{red}{falsch} \end{tabular} - \hspace{0.1\textwidth} + \hfill \begin{tabular}{llll} - \multicolumn{2}{l}{\multirow{2}{*}{}} & \multicolumn{2}{c}{\textbf{B}} \\ - \multicolumn{2}{l}{} & \multicolumn{1}{|c}{wahr} & falsch \\ \cline{2-4} + \multicolumn{2}{l}{\multirow{2}{*}{}} & \multicolumn{2}{c}{\textbf{B}} \\ + & \sffamily{\textbf{oder}} & \multicolumn{1}{|c}{wahr} & falsch \\ \cline{2-4} \multirow{2}{*}{\textbf{A}} & \multicolumn{1}{l|}{wahr} & \multicolumn{1}{c}{\textcolor{mygreen}{wahr}} & \textcolor{mygreen}{wahr} \erb \\ & \multicolumn{1}{l|}{falsch} & \multicolumn{1}{l}{\textcolor{mygreen}{wahr}} & \textcolor{red}{falsch} \end{tabular} + \hfill + \begin{tabular}{llll} + \multicolumn{2}{l}{\multirow{2}{*}{}} & \multicolumn{2}{c}{\textbf{B}} \\ + & \sffamily{\textbf{xor}} & \multicolumn{1}{|c}{wahr} & falsch \\ \cline{2-4} + \multirow{2}{*}{\textbf{A}} & \multicolumn{1}{l|}{wahr} & \multicolumn{1}{c}{\textcolor{red}{falsch}} & \textcolor{mygreen}{wahr} \erb \\ + & \multicolumn{1}{l|}{falsch} & \multicolumn{1}{l}{\textcolor{mygreen}{wahr}} & \textcolor{red}{falsch} + \end{tabular} \end{table} -Anders ist das beim logischen ODER. Hier ist der gesamte Ausdruck -wahr, wenn sich der eine \emph{oder} der andere Ausdruck zu wahr -auswerten l\"a{\ss}t. Tabelle \ref{logicaloperators} zeigt die -logischen Operatoren, die in \matlab{} definiert sind. Zu bemerken -sind hier noch die \code[Operator!logischer!and2@\&\&]{\&\&} und -\code[Operator!logischer!or2@{"|}{"|} {}]{||} Operatoren. Man kann beliebige -Ausdr\"ucke verkn\"upfen und h\"aufig kann schon anhand des ersten -Ausdrucks entschieden werden, ob der gesamte Boolesche Ausdruck zu -wahr oder falsch ausgewertet werden wird. Wenn zwei Aussagen mit einem -UND verkn\"upft werden und der erste zu falsch ausgewertet wird, muss -der zweite gar nicht mehr gepr\"uft werden. Die Verwendung der -\enterm{short-circuit} Versionen spart Rechenzeit. Das auschlie{\ss}ende -ODER (XOR) ist in \matlab{} nur als Funktion \code[xor()]{xor(A, B)} -verf\"ugbar. - -\begin{table}[th] - \titlecaption{\label{logicaloperators} - Logische Operatoren in \matlab.}{} - \begin{center} - \begin{tabular}{cc} - \hline - \textbf{Operator} & \textbf{Beschreibung} \erh \\ \hline - $\sim$ & logisches NICHT \erb \\ - $\&$ & logisches UND\\ - $|$ & logisches ODER\\ - $\&\&$ & short-circuit logisches UND\\ - $\|$ & short-circuit logisches ODER\\ - \hline - \end{tabular} - \end{center} +Tabelle \ref{logicalrelationaloperators} zeigt die logischen Operatoren, die in +\matlab{} definiert sind. Zu bemerken sind hier noch die +\code[Operator!logischer!and2@\&\&]{\&\&} und +\code[Operator!logischer!or2@{"|}{"|} {}]{||} Operatoren. Man kann +beliebige Ausdr\"ucke verkn\"upfen und h\"aufig kann schon anhand des +ersten Ausdrucks entschieden werden, ob der gesamte Boolesche Ausdruck +zu wahr oder falsch ausgewertet werden wird. Wenn zwei Aussagen mit +einem UND verkn\"upft werden und der erste zu falsch ausgewertet wird, +muss der zweite gar nicht mehr gepr\"uft werden. Die Verwendung der +\enterm{short-circuit} Versionen spart Rechenzeit, da die Ausdr\"ucke +nur sowei wie n\"otig ausgewertet werden. + +\begin{table}[t] + \titlecaption{\label{logicalrelationaloperators} + Logische (links) und relationale (rechts) Operatoren in \matlab.}{} + \begin{tabular}{cc} + \hline + \textbf{Operator} & \textbf{Beschreibung} \erh \\ \hline + \varcode{$\sim$} & logisches NICHT \erb \\ + \varcode{$\&$} & logisches UND\\ + \varcode{$|$} & logisches ODER\\ + \varcode{$\&\&$} & short-circuit logisches UND\\ + \varcode{$\|$} & short-circuit logisches ODER\\ + \hline + \end{tabular} + \hfill + \begin{tabular}{cc} + \hline + \textbf{Operator} & \textbf{Beschreibung} \erh \\ \hline + \varcode{$==$} & gleich \erb \\ + \varcode{$\sim=$} & ungleich\\ + \varcode{$>$} & gr\"o{\ss}er als \\ + \varcode{$<$} & kleiner als \\ + \varcode{$>=$} & gr\"o{\ss}er oder gleich \\ + \varcode{$<=$} & kleiner oder gleich \\ + \hline + \end{tabular} \end{table} Um Werte miteinander zu vergleichen gibt es die \codeterm[Operator!relationaler]{relationalen Operatoren} (Tabelle -\ref{relationaloperators}). Mit ihnen kann man auf Dinge wie +\ref{logicalrelationaloperators}). Mit ihnen kann man auf Dinge wie Gleichheit (\varcode{==}) gr\"o{\ss}er oder kleiner als (\varcode{>}, \varcode{<}) testen. -\begin{table}[th] - \titlecaption{\label{relationaloperators} - Relationale Operatoren in \matlab.}{} - \begin{center} - \begin{tabular}{cc} - \hline - \textbf{Operator} & \textbf{Beschreibung} \erh \\ \hline - $<$ & kleiner als \erb \\ - $>$ & gr\"o{\ss}er als \\ - $==$ & gleich \\ - $>=$ & gr\"o{\ss}er oder gleich \\ - $<=$ & kleiner oder gleich \\ - $\sim=$ & ungleich\\ - \hline - \end{tabular} - \end{center} -\end{table} - -Das Ergebnis eines Booleschen Ausdrucks ist immer vom Datentyp -\codeterm{logical}. Man kann jede beliebige Variable zu wahr oder falsch -auswerten indem man in den Typ \code{logical} umwandelt. Dabei -werden von \matlab{} alle Werte, die nicht 0 sind als wahr -eingesch\"atzt. Listing \ref{booleanexpressions} zeigt einige -Beispiele. \matlab{} kennt die Schl\"usselworte \code{true} und -\code{false}. Diese sind jedoch nur Synonyme f\"ur die -\code{logical} Werte 1 und 0. - \begin{important}[Zuweisungs- und Gleichheitsoperator] Der Zuweisungsoperator \code[Operator!Zuweisung!=]{=} und der logische Operator \code[Operator!logischer!==]{==} sind zwei @@ -754,70 +866,76 @@ Beispiele. \matlab{} kennt die Schl\"usselworte \code{true} und k\"onnen sie leider leicht verwechselt werden. \end{important} +Das Ergebnis eines Booleschen Ausdrucks ist immer vom Datentyp +\codeterm{logical}. Jede beliebige Variable zu wahr oder falsch +ausgewertet werden indem diese in den Typ \code{logical} umgewandelt +wird. Dabei werden von \matlab{} alle Werte, die nicht 0 sind als wahr +eingesch\"atzt. Listing \ref{booleanexpressions} zeigt einige +Beispiele. \matlab{} kennt die Schl\"usselworte \code{true} und +\code{false}. Diese sind Synonyme f\"ur die \code{logical} Werte 1 und +0. + \begin{lstlisting}[caption={Boolesche Ausdr\"ucke.}, label=booleanexpressions] - >> true - ans = - 1 - >> false - ans = - 0 - >> logical(1) - ans = - 1 - >> 1 == true - ans = - 1 - >> 1 == false - ans = - 0 - >> logical('test') - ans = - 1 1 1 1 - - >> 1 > 2 - ans = - 0 - >> 1 < 2 - ans = - 1 - >> x = [2 0 0 5 0] & [1 0 3 2 0] - x = - 1 0 0 1 0 - - >> ~([2 0 0 5 0] & [1 0 3 2 0]) - ans = - 0 1 1 0 1 - - >> [2 0 0 5 0] | [1 0 3 2 0] - ans = - 1 0 1 1 0 +>> true +ans = 1 +>> false +ans = 0 +>> logical(1) +ans = 1 +>> 1 == true +ans = 1 +>> 1 == false +ans = 0 +>> logical('test') +ans = 1 1 1 1 +>> 1 > 2 +ans = 0 +>> 1 < 2 +ans = 1 +>> x = [2 0 0 5 0] & [1 0 3 2 0] +x = 1 0 0 1 0 +>> ~([2 0 0 5 0] & [1 0 3 2 0]) +ans = 0 1 1 0 1 +>> [2 0 0 5 0] | [1 0 3 2 0] +ans = 1 0 1 1 0 \end{lstlisting} \section{Logisches Indizieren}\label{logicalindexingsec} Einer der wichtigsten Einsatzorte f\"ur Boolesche Ausdr\"ucke ist das -logische Indizieren. Das logische Indizieren ist eines der +logische Indizieren. Logisches Indizieren ist eines der Schl\"usselkonzepte in \matlab{}. Nur mit diesem k\"onnen Filteroperationen auf Vektoren und Matrizen effizient durchgef\"uhrt werden. Es ist sehr m\"achtig und, wenn es einmal verstanden wurde, sehr intuitiv zu benuzten. -Das Grundkonzept hinter der logischen Indizierung ist, dass man durch -die Verwendung eines Booleschen Ausdrucks auf z.B. einen Vektor einen -logischen Vektor gleicher Gr\"o{\ss}e erh\"alt. Dieser wird -benutzt um auf den urspr\"unglichen Vektor zuzugreifen. \matlab{} gibt -nur die Werte an den Stellen zur\"uck, an denen der logische Vektor -\codeterm{wahr} ist (Listing \ref{logicalindexing1}). - +Das Grundkonzept hinter der logischen Indizierung ist, dass durch die +Verwendung eines Booleschen Ausdrucks auf z.B. einen Vektor ein +logischer Vektor gleicher Gr\"o{\ss}e zur\"uckgegeben wird. Dieser +wird benutzt um die Elemente des urspr\"unglichen Vektors +auszuw\"ahlen, bei denen der logische Vektor \codeterm{wahr} ist +(Listing \ref{logicalindexing1}). Zeile 14 kann wie +folgt gelesen werden: Gib die Elemente von \varcode{x} an den +Stellen, an denen \varcode{x < 0} wahr ist, zur\"uck. \begin{lstlisting}[caption={Beispiel logisches Indizieren.}, label=logicalindexing1] - >> x = randn(10, 1); - >> % in zwei Schritten - >> x_smaller_zero = x < 0; % logischer vektor - >> elements_smaller_zero = x(x_smaller_zero); % benutzen, um zuzugreifen - >> % oder in einem Schritt - >> elements_smaller_zero = x(x < 0); +>> x = randn(1, 6) % Zeilenvektor mit 6 Zufallszahlen +x = + -1.4023 -1.4224 0.4882 -0.1774 -0.1961 1.4193 + +>> % logisches Indizieren in zwei Schritten: +>> x_smaller_zero = x < 0 % logischer Vektor +x_smaller_zero = + 1 1 0 1 1 0 +>> elements_smaller_zero = x(x_smaller_zero) % benutzen, um zuzugreifen +elements_smaller_zero = + -1.4023 -1.4224 -0.1774 -0.1961 + +>> % logisches Indizieren in einem Schritten: +>> elements_smaller_zero = x(x < 0) +elements_smaller_zero = + -1.4023 -1.4224 -0.1774 -0.1961 \end{lstlisting} \begin{exercise}{logicalVector.m}{logicalVector.out} @@ -828,20 +946,9 @@ nur die Werte an den Stellen zur\"uck, an denen der logische Vektor \item Was ist der Datentyp von \varcode{y}? \item Gibt alle Elemente aus \varcode{x} zur\"uck, die kleiner als 5 sind. \end{enumerate} - - Zeile 12 in der L\"osung kann wie folgt gelesen werden: Gib mir die Elemente - von (\varcode{x}) an den Stellen, an denen \varcode{x < 5} wahr ist. + \pagebreak[4] \end{exercise} -Logisches Indizieren wurde oben so benutzt, dass die Auswahl -auf dem Inhalt desselben Vektors beruhte. Ein sehr h\"aufiger Fall ist -jedoch, dass die Auswahl aus einem Vektor auf dem Inhalt eines -zweiten Vektors basiert. Ein Beispiel ist, dass man \"uber einen -gewissen Zeitraum Daten aufnimmt und aus diesen die Daten eines -bestimmten Zeitraums ausw\"ahlen m\"ochte (Abbildung -\ref{logicalindexingfig}). - - \begin{figure}[t] \includegraphics[width= 0.9\columnwidth]{logicalIndexingTime} \titlecaption{Beispiel f\"ur logisches Indizieren.} @@ -850,6 +957,13 @@ bestimmten Zeitraums ausw\"ahlen m\"ochte (Abbildung ausgew\"ahlt (\varcode{x(t > 5 \& t < 6)}).}\label{logicalindexingfig} \end{figure} +Logisches Indizieren wurde oben so benutzt, dass die Auswahl auf dem +Inhalt desselben Vektors beruhte. Ein weiterer sehr h\"aufiger Fall +ist jedoch, dass die Auswahl aus einem Vektor auf dem Inhalt eines +zweiten Vektors basiert. Ein Beispiel ist, dass \"uber einen +gewissen Zeitraum Daten aufgenommen werden und aus diesen die Daten eines +bestimmten Zeitraums ausgew\"ahlt werden sollen (\figref{logicalindexingfig}). + \begin{exercise}{logicalIndexingTime.m}{} Angenommen es werden \"uber einen bestimmten Zeitraum Messwerte genommen. Bei solchen Messungen erh\"alt man einen Vektor, der die @@ -857,12 +971,12 @@ bestimmten Zeitraums ausw\"ahlen m\"ochte (Abbildung jeweiligen Messwerten. \begin{itemize} - \item Erstelle einen Vektor \varcode{t = 0:0.001:10;}, der z.B. die Zeit + \item Erstelle einen Vektor \varcode{t = 0:0.001:10;}, der die Zeit repr\"asentiert. - \item Erstelle einen zweiten Vektor \varcode{x} mit Zufallszahlen der + \item Erstelle einen zweiten Vektor \varcode{x} mit Zufallszahlen, der die gleiche L\"ange hat wie \varcode{t}. Die Werte darin stellen Messungen zu den Zeitpunkten in \varcode{t} dar. - \item Benutze das logische Indizieren um die Messwerte + \item Benutze logische Indizieren um die Messwerte auszuw\"ahlen, die dem zeitlichen Abschnitt 5--6\,s entsprechen. \end{itemize} \end{exercise} @@ -902,28 +1016,29 @@ x = Im Prinzip ist das obige Programm v\"ollig in Ordnung. Es f\"allt jedoch auf, dass die Zeilen 2 bis 5 sehr \"ahnlich sind; bis auf die Multiplikation mit einer ansteigenden Zahl \"andert sich nichts. Die -Verwendung von mehr oder weniger exakten Klonen einzelner Zeilen oder -ganzer Abschnitte ist schlechter Prgrammierstil. Dabei geht es nicht nur um -einen \"asthetischen Aspekt sondern vielmehr darum, dass es schwerwiegende Nachteile gibt. +Verwendung von mehr oder weniger exakten Wiederholungen einzelner +Zeilen oder ganzer Abschnitte ist schlechter Prgrammierstil. Dabei +geht es nicht nur um einen \"asthetischen Aspekt sondern vielmehr +darum, dass es schwerwiegende Nachteile gibt: \begin{enumerate} \item Fehleranf\"alligkeit: Beim ``Copy-and-paste'' kann leicht - vergessen werden in einzelnen Klonen die entscheidende \"Anderung - auch wirklich vorzunehmen. + vergessen werden in einzelnen Wiederholungen die entscheidende + \"Anderung auch wirklich vorzunehmen. \item Flexibilit\"at: Das obige Programm ist f\"ur genau einen Zweck, Berechnung der Fakult\"at von f\"unf, gemacht und kann nichts anderes. -\item Wartung: Wenn ich einen Fehler gemacht habe, dann muss ich den - Fehler in allen Klonen korrigieren (sehr leicht wird dabei der ein oder - andere Klon \"ubersehen). -\item Verst\"andlichkeit: Solche Abschnitte sind schwerer zu lesen/zu - verstehen. Das liegt zum Teil daran, dass man dazu neigt \"uber sich - wiederholende Zeilen zu springen (ist ja eh das gleiche...) und dann - den entscheidenden Teil verpasst. Zum Anderen f\"uhrt - Codeduplication zu langen, un\"ubersichtlichen Programmen. +\item Wartung: Wenn ein Fehler gemacht wurde, dann muss der Fehler in + allen Wiederholungen korrigiert werden (sehr leicht wird dabei etwas + \"ubersehen). +\item Verst\"andlichkeit: Solche Abschnitte sind schwerer zu lesen und + schwer zu verstehen. Das liegt zum Teil daran, dass man dazu neigt + \"uber sich wiederholende Zeilen zu springen (ist ja eh das + gleiche...) und dann den entscheidenden Teil verpasst. Zum Anderen + f\"uhrt Codeduplication zu langen, un\"ubersichtlichen Programmen. \end{enumerate} Alle Programmiersprachen bieten zur L\"osung dieses Problems die -Schleifen. Eine Schleife wird immer dann eingesetzt, wenn man -Abschnitte wiederholt ausf\"uhren will. +Schleifen. Eine Schleife wird immer dann eingesetzt, wenn +Abschnitte wiederholt ausgef\"uhrt werden sollen. \subsubsection{Die \code{for} -- Schleife} @@ -943,7 +1058,7 @@ das Grundger\"ust einer for-Schleife. \begin{lstlisting}[caption={Beispiel einer \varcode{for}-Schleife.}, label=looplisting] >> for x = 1:5 - disp(x); + x end % die Laufvariable x nimmt mit jeder Iteration der Schleife % einen Wert des Vektors 1:5 an: @@ -977,11 +1092,10 @@ Schl\"usselwort \code{end} beendet. \begin{lstlisting}[caption={Grundstruktur einer \varcode{while} Schleife.}, label=whileloop] while x == true - % fuehre diesen sinnvollen code aus ... + % fuehre diesen sinnvollen Code aus ... end \end{lstlisting} - \begin{exercise}{facultyWhileLoop.m}{} Implementiere die Fakult\"at mit einer \code{while}-Schleife. \end{exercise} @@ -991,6 +1105,7 @@ end Implementiere eine \code{while}-Schleife, die unendlich l\"auft. Tipp: wenn der Boolesche Ausdruck hinter dem \code{while} zu wahr ausgewertet wird, wird die Schleife weiter ausgef\"uhrt. + Das Programm kann mit \keycode{Ctrl+C} abgebrochen werden. \end{exercise} @@ -1036,22 +1151,22 @@ beendet. Listing \ref{ifelselisting} zeigt den Aufbau einer \begin{lstlisting}[label=ifelselisting, caption={Grundger\"ust einer \varcode{if} Anweisung.}] - if x < y - % fuehre diesen code aus +if x < y + % fuehre diesen code aus wenn x < y elseif x > y - % etwas anderes soll getan werden + % etwas anderes soll getan werden fuer x > y else % wenn x == y, wieder etwas anderes end \end{lstlisting} \begin{exercise}{ifelse.m}{} - Ziehe eine Zufallszahl und \"uberpr\"ufe mit einer geeigneten \code{if} Anweisung, ob sie: + Ziehe eine Zufallszahl und \"uberpr\"ufe mit einer geeigneten \code{if} Anweisung, ob sie \begin{enumerate} - \item ... kleiner als 0.5 ist. - \item ... kleiner oder gr\"o{\ss}er-gleich 0.5 ist. - \item ... 1. kleiner als 0.5, 2. gr\"o{\ss}er oder gleich 0.5 aber kleiner - als 0.75 oder 3. gr\"o{\ss}er oder gleich 0.75 ist. + \item kleiner als 0.5 ist. + \item kleiner oder gr\"o{\ss}er-gleich 0.5 ist. + \item (i) kleiner als 0.5, (ii) gr\"o{\ss}er oder gleich 0.5 aber kleiner + als 0.75 oder (iii) gr\"o{\ss}er oder gleich 0.75 ist. \end{enumerate} \end{exercise} @@ -1081,7 +1196,7 @@ switch mynumber disp('positive one'); otherwise disp('something else'); - end +end \end{lstlisting} Wichtig ist hier, dass in jedem \code{case} auf Gleichheit der @@ -1160,7 +1275,7 @@ end \item In dem Programm sollen 10 Realisationen eines random walk mit jeweils 1000 Schritten durchgef\"uhrt werden. \item Die Position des Objektes ver\"andert sich in jedem Schritt zuf\"allig um - +1 oder -1. + $+1$ oder $-1$. \item Merke Dir alle Positionen. \item Plotte die Positionen als Funktion der Schrittnummer. \end{itemize} @@ -1201,15 +1316,15 @@ dieses Problem bieten die \codeterm[Funktion]{Funktionen}. Eine Funktion in \matlab{} wird \"ahnlich zu einer mathematischen Funktion definiert: \[ y = f(x) \] -Die Funktion hat einen Namen $f$, sie h\"angt von einem Argument $x$ -ab und liefert ein Ergebnis $y$ zur\"uck. Listing +Die Funktion hat einen Namen $f$, sie \"uber das Argument $x$ +einen Input und liefert ein Ergebnis in $y$ zur\"uck. Listing \ref{functiondefinitionlisting} zeigt wie das in \matlab{} umgesetzt wird. \begin{lstlisting}[caption={Funktionsdefinition in \matlab{}}, label=functiondefinitionlisting] -function [y] = function_name(arg_1, arg_2) -% ^ ^ ^ -% Rueckgabewert Argument_1, Argument_2 +function [y] = functionName(arg_1, arg_2) +% ^ ^ ^ +% Rueckgabewert Argument_1, Argument_2 \end{lstlisting} Ein Funktion beginnt mit dem Schl\"usselwort \code{function} gefolgt @@ -1233,21 +1348,21 @@ definiert. \"Uber die Definition/Benutzung von Funktionen wird folgendes erreich \item Erh\"oht die Lesbarkeit von Programmen, da sie \"ubersichtlicher werden. \end{itemize} + Das Folgende Beispiel (Listing \ref{badsinewavelisting}) zeigt eine Funktion, die eine Reihe von Sinusschwingungen unterschiedlicher Frequenzen berechnet und graphisch darstellt. - \begin{lstlisting}[caption={Ein schlechtes Beispiel einer Funktion, die eine Reihe Sinusse plottet.},label=badsinewavelisting] -function meine_erste_funktion() % Funktionskopf +function meineErsteFunktion() % Funktionskopf t = (0:0.01:2); % hier faengt der Funktionskoerper an frequenz = 1.0; amplituden = [0.25 0.5 0.75 1.0 1.25]; - for i = 1:length(amplituden) y = sin(frequenz * t * 2 * pi) * amplituden(i); plot(t, y) hold on; end +end \end{lstlisting} Das obige Beispiel ist ein Paradebeispiel f\"ur eine schlechte Funktion. Sie hat folgende Probleme: @@ -1295,7 +1410,7 @@ welche Daten sie zur\"uckliefern soll. bestimmt. Des Weiteren soll noch festgelegt werden, wie lang der Sinus sein soll und mit welcher zeitlichen Aufl\"osung gerechnet werden soll. Es werden also vier Argumente ben\"otigt, sie k\"onnten - hei{\ss}en: \varcode{varamplitude}, \varcode{frequency}, + hei{\ss}en: \varcode{amplitude}, \varcode{frequency}, \varcode{t\_max}, \varcode{t\_step}. \item \codeterm[Funktion!R{\"u}ckgabewerte]{R\"uckgabewerte}: Um den Sinus korrekt darstellen zu k\"onnen brauchen wir die Zeitachse und @@ -1307,14 +1422,19 @@ implementieren (Listing \ref{sinefunctionlisting}). \begin{lstlisting}[caption={Funktion zur Berechnung eines Sinus.}, label=sinefunctionlisting] function [time, sine] = sinewave(frequency, amplitude, t_max, t_step) - % Calculate a sinewave of a given frequency, amplitude, duration and temporal resolution. - % [time, sine] = sinewave(frequency, amplitude, t_max, t_step) - % Arguments: frequency, the frequency of the sine - % amplitude, the amplitude of the sine - % t_max, the duration of the sine in seconds - % t_step, the temporal resolution in seconds - % Returns: time, the time axis - % sine, the calculated sinewave +% Calculate a sinewave of a given frequency, amplitude, +% duration and temporal resolution. +% +% [time, sine] = sinewave(frequency, amplitude, t_max, t_step) +% +% Arguments: +% frequency: the frequency of the sine +% amplitude: the amplitude of the sine +% t_max : the duration of the sine in seconds +% t_step : the temporal resolution in seconds +% Returns: +% time: vector of the time axis +% sine: vector of the calculated sinewave time = (0:t_step:t_max); sine = sin(frequency .* time .* 2 * pi) .* amplitude; end @@ -1325,7 +1445,7 @@ end Das Plotten der berechneten Sinuschwingung kann auch von einer Funktion \"ubernommen werden. Diese Funktion hat keine andere Aufgabe, als die Daten zu plotten. Ihr Name sollte sich an dieser Aufgabe -orientieren (z.B. \code{plot\_function()}). Um einen einzelnen Sinus +orientieren (z.B. \code{plotFunction()}). Um einen einzelnen Sinus zu plotten werden im Wesentlichen die x-Werte und die zugeh\"origen y-Werte ben\"otigt. Da mehrere Sinus geplottet werden sollen ist es auch sinnvoll eine Zeichenkette f\"ur die Legende an die Funktion zu @@ -1333,12 +1453,15 @@ auch sinnvoll eine Zeichenkette f\"ur die Legende an die Funktion zu R\"uckgabewert ben\"otigt (Listing \ref{sineplotfunctionlisting}). \begin{lstlisting}[caption={Funktion zur graphischen Darstellung der Daten.}, label=sineplotfunctionlisting] -function plot_function(x_data, y_data, name) - % Plots x-data against y-data and sets the display name. - % plot_sinewave(x_data, y_data, name) - % Arguments: x_data, the x-data - % y_data, the y-data - % name, the displayname +function plotFunction(x_data, y_data, name) +% Plots x-data against y-data and sets the display name. +% +% plotFunction(x_data, y_data, name) +% +% Arguments: +% x_data: vector of the x-data +% y_data: vector of the y-data +% name : the displayname plot(x_data, y_data, 'displayname', name) end \end{lstlisting} @@ -1347,37 +1470,39 @@ end \paragraph{III. Erstellen eines Skriptes zur Koordinierung} Die letzte Aufgabe ist die Koordinierung der Berechung und des Plottens f\"ur mehrere Amplituden. Das ist die klassische Aufgabe -f\"ur ein \codeterm{Skript}. Auch hier gilt es einen ausdrucksvollen Name zu -finden. Da es keine Argumente und R\"uckgabewerte gibt, m\"ussen die -ben\"otigten Informationen direkt in dem Skript defniniert werden. Es -werden ben\"otigt: ein Vektor f\"ur die Amplituden, je eine Variable -f\"ur die gew\"unschte Frequenz, die maximale Zeit auf der x-Achse und -die zeitliche Aufl\"osung. Das Skript \"offnet schlie{\ss}lich noch -eine neue Abbildung und setzt das \code{hold on} da nur das Skript +f\"ur ein \codeterm{Skript}. Auch hier gilt es einen ausdrucksvollen +Name zu finden. Da es keine Argumente und R\"uckgabewerte gibt, +m\"ussen die ben\"otigten Informationen direkt in dem Skript +defniniert werden. Es werden ben\"otigt: ein Vektor f\"ur die +Amplituden, je eine Variable f\"ur die gew\"unschte Frequenz, die +maximale Zeit auf der x-Achse und die zeitliche Aufl\"osung. Das +Skript \"offnet schlie{\ss}lich noch eine neue Abbildung mit +\code{figure()} und setzt das \code{hold on} da nur das Skript wei{\ss}, das mehr als ein Plot erzeugt werden soll. Das Skript ist in Listing \ref{sinesskriptlisting} dargestellt. -\begin{lstlisting}[caption={Kontrollskript zur Koordination von Berechnung und graphischer Darstellung.}, label=sinesskriptlisting] +\begin{lstlisting}[caption={Kontrollskript zur Koordination von Berechnung und graphischer Darstellung.},label=sinesskriptlisting] amplitudes = 0.25:0.25:1.25; frequency = 2.0; t_max = 10.0; t_step = 0.01; - + figure() hold on - for i = 1:length(amplitudes) [x_data, y_data] = sinewave(frequency, amplitudes(i), ... t_max, t_step); - plot_function(x_data, y_data, sprintf('freq: %5.2f, ampl: %5.2f',... - frequency, amplitudes(i))) + plotFunction(x_data, y_data, sprintf('freq: %5.2f, ampl: %5.2f',... + frequency, amplitudes(i))) end +hold off legend('show') \end{lstlisting} \begin{exercise}{plotMultipleSinewaves.m}{} - Erweitert das Programm so, dass auch ein Satz von Frequenzen benutzt - wird. + Erweiter das Programm so, dass die Sinusse f\"ur einen Satz von + Frequenzen geplottet wird. + \pagebreak[4] \end{exercise} \subsection{Fazit} @@ -1394,7 +1519,7 @@ Die vorangegangene Aussagen klingen, als ob Skripte zu verteufeln w\"aren und und vermieden werden sollten. Dem ist nicht so. In Wahrheit sind sie daf\"ur gemacht, Hand in Hand mit den Funktionen ein Problem zu l\"osen. W\"ahrend die Funktionen relativ -kleine ``verdauliche'' Teilprobleme l\"osen. Sind die Skripte daf\"ur +kleine ``verdauliche'' Teilprobleme l\"osen, sind Skripte daf\"ur gemacht den Rahmen zu bilden und den Ablauf zu koordinieren (Abbildung \ref{programlayoutfig}). diff --git a/regression/code/errorGradient.m b/regression/code/errorGradient.m index ac484ec..a24367f 100644 --- a/regression/code/errorGradient.m +++ b/regression/code/errorGradient.m @@ -1,5 +1,4 @@ load('lin_regression.mat') - ms = -1:0.5:5; ns = -10:1:10; @@ -27,4 +26,4 @@ ylabel('Intercept b') zlabel('Mean squared error') set(gcf, 'paperunits', 'centimeters', 'papersize', [15, 10.5], ... 'paperposition', [0., 0., 15, 10.5]) -saveas(gcf, 'error_gradient', 'pdf') \ No newline at end of file +saveas(gcf, 'error_gradient', 'pdf') diff --git a/regression/code/lsqGradient.m b/regression/code/lsqGradient.m index 4041d9e..39bfbbb 100644 --- a/regression/code/lsqGradient.m +++ b/regression/code/lsqGradient.m @@ -7,11 +7,8 @@ function gradient = lsqGradient(parameter, x, y) % y, vector of the corresponding measured output values % % Returns: the gradient as a vector with two elements - h = 1e-6; % stepsize for derivatives - partial_m = (lsqError([parameter(1)+h, parameter(2)], x, y) - lsqError(parameter, x, y))/ h; partial_n = (lsqError([parameter(1), parameter(2)+h], x, y) - lsqError(parameter, x, y))/ h; - gradient = [partial_m, partial_n]; end diff --git a/regression/lecture/regression.tex b/regression/lecture/regression.tex index ffa32c2..cdfeb8c 100644 --- a/regression/lecture/regression.tex +++ b/regression/lecture/regression.tex @@ -316,7 +316,6 @@ partielle Ableitung nach $m$ durch Parametersatz $(m, b)$ der Geradengleichung als 2-elementigen Vektor sowie die $x$- und $y$-Werte der Messdaten als Argumente entgegennimmt und den Gradienten an dieser Stelle zur\"uckgibt. - \pagebreak[4] \end{exercise} \begin{exercise}{errorGradient.m}{} @@ -378,7 +377,6 @@ Punkte in Abbildung \ref{gradientdescentfig} gro{\ss}. Funktion der Optimierungsschritte zeigt. \item Erstelle einen Plot, der den besten Fit in die Daten plottet. \end{enumerate} - \pagebreak \end{exercise} From df2821d97aedb9d31a50c85a7a8a5ad457205542 Mon Sep 17 00:00:00 2001 From: Jan Benda Date: Sun, 29 Nov 2015 23:24:08 +0100 Subject: [PATCH 16/17] small fixes --- header.tex | 6 +++--- plotting/lecture/plotting.tex | 20 ++++++++------------ programming/lecture/programming.tex | 7 +++---- 3 files changed, 14 insertions(+), 19 deletions(-) diff --git a/header.tex b/header.tex index fafdaa5..53a6386 100644 --- a/header.tex +++ b/header.tex @@ -68,9 +68,9 @@ % float placement fractions: \renewcommand{\textfraction}{0.2} -\renewcommand{\topfraction}{0.8} +\renewcommand{\topfraction}{0.9} \renewcommand{\bottomfraction}{0.0} -\renewcommand{\floatpagefraction}{0.5} +\renewcommand{\floatpagefraction}{0.7} % spacing for floats: \setlength{\floatsep}{12pt plus 2pt minus 2pt} @@ -261,7 +261,7 @@ \ifthenelse{\equal{\exercisesource}{}}{}% {\ifthenelse{\value{exercisef}>\value{maxexercise}}{}% {\addtocounter{lstlisting}{-1}% - \lstinputlisting[belowskip=0pt,aboveskip=1ex,nolol=true,title={\textbf{Listing:} \exercisefile}]{\codepath\exercisesource}% + \lstinputlisting[belowskip=0pt,aboveskip=1ex,nolol=true,title={\textbf{\tr{Solution}{L\"osung}:} \exercisefile}]{\codepath\exercisesource}% \ifthenelse{\equal{\exerciseoutput}{}}{}% {\addtocounter{lstlisting}{-1}% \lstinputlisting[language={},title={\textbf{\tr{Output}{Ausgabe}:}},nolol=true,belowskip=0pt]{\codepath\exerciseoutput}}}}% diff --git a/plotting/lecture/plotting.tex b/plotting/lecture/plotting.tex index df502de..530616e 100644 --- a/plotting/lecture/plotting.tex +++ b/plotting/lecture/plotting.tex @@ -376,6 +376,12 @@ erstes Argument wieder ein Handle auf die Figure erwartet. Das zweite Argument ist der Dateiname, und zuletzt muss das gew\"unschte Format (Box \ref{graphicsformatbox}) angegeben werden. +\begin{figure}[t] + \includegraphics{spike_detection} + \titlecaption{Automatisch erstellter Plot.}{Dieser Plot wurde vollst\"andig + mit dem Skript in Listing \ref{niceplotlisting} erstellt und + gespeichert.}\label{spikedetectionfig} +\end{figure} \begin{ibox}[t]{\label{graphicsformatbox}Dateiformate f\"ur Abbildungen.} Es gibt zwei grunds\"atzlich verschiedene Arten von Dateiformaten f\"ur Graphiken: @@ -383,7 +389,6 @@ Argument ist der Dateiname, und zuletzt muss das gew\"unschte Format \item \determ{Rastergraphik} (\enterm{bitmap}) \item \determ{Vektorgraphik} (\enterm{vector graphics}) \end{enumerate} - Bei Rastergraphiken wird f\"ur jeden Bildpunkt (jedes Pixel) der aktuelle Farbwert angegeben. Rastergraphiken haben eine bestimmte Aufl\"osung (z.B. 300\,dpi --- dots per inch). Sie sind vor allem @@ -392,15 +397,14 @@ Argument ist der Dateiname, und zuletzt muss das gew\"unschte Format Polygone, ...) beschrieben. Der Vorteil der Vektorgraphiken ist die Skalierbakeit ohne Qualit\"atsverlust. - \vspace{1ex} \begin{minipage}[t]{0.38\textwidth} \mbox{}\\[-2ex] - \includegraphics[width=0.93\textwidth]{VectorBitmap.pdf} + \includegraphics[width=0.85\textwidth]{VectorBitmap.pdf} \rotatebox{90}{\footnotesize by Darth Stabro at en.wikipedia.org} \end{minipage} \hfill \begin{minipage}[t]{0.5\textwidth} - Von \matlab{} unterst\"utzte Formate\footnote{Auswahl, mehr Information in der Hilfe zu \code{saveas()}}:\\[2ex] + Von \matlab{} unterst\"utzte Formate\footnote{mehr Information in der Hilfe zu \code{saveas()}}:\\[2ex] \begin{tabular}{|l|c|l|} \hline \textbf{Format} & \textbf{Typ} & \code{saveas()} Argument \erh \\ \hline @@ -414,7 +418,6 @@ Argument ist der Dateiname, und zuletzt muss das gew\"unschte Format bmp & Bitmap & \varcode{'bmp'} \\ \hline \end{tabular} \end{minipage} - \vspace{1ex} Wenn aus \matlab{} heraus Graphiken gespeichert werden sollen, dann ist es meistens sehr sinnvoll sie als Vektorgraphik zu speichern. Im @@ -426,13 +429,6 @@ Argument ist der Dateiname, und zuletzt muss das gew\"unschte Format Rastergraphik allerdings deutlich schneller und speichereffizienter. \end{ibox} -\begin{figure}[t] - \includegraphics{spike_detection} - \titlecaption{Automatisch erstellter Plot.}{Dieser Plot wurde vollst\"andig - mit dem Skript in Listing \ref{niceplotlisting} erstellt und - gespeichert.}\label{spikedetectionfig} -\end{figure} - \lstinputlisting[caption={Skript zur Erstellung des Plots in \figref{spikedetectionfig}.}, label=niceplotlisting]{automatic_plot.m} Neben den Standard-Linienplots gibt es eine ganze Reihe weiterer diff --git a/programming/lecture/programming.tex b/programming/lecture/programming.tex index f4390fc..71dc926 100644 --- a/programming/lecture/programming.tex +++ b/programming/lecture/programming.tex @@ -62,7 +62,7 @@ Gleichheitszeichen ist der sogenannte ein leerer Wert zugewiesen wird. Da \matlab{}, wenn nicht anders angegeben, immer den \codeterm{double} Datentypen benutzt, haben beide Variablen diesen Datentyp. In Zeile 9 wird der Variablen \varcode{z} der Buchstabe -``A'' zugewiesen. \varcode{z} nicht ein Flie{\ss}kommazahl von Typ \codeterm{double}, +``A'' zugewiesen. \varcode{z} ist nicht ein Flie{\ss}kommazahl von Typ \codeterm{double}, sondern ein \codeterm{character} (Zeichen). Der Datentyp einer Variable kann mit \code{class()} abgefragt werden. @@ -266,7 +266,6 @@ Vektor \varcode{a} von oben hat folgende Gr\"o{\ss}en: >> length(a) ans = 10 - >> size(a) ans = 1 10 @@ -291,7 +290,6 @@ b = >> length(b) ans = 10 - >> size(b) ans = 10 1 @@ -526,13 +524,14 @@ m\"oglich, vermieden werden. \begin{lstlisting}[caption={Zusammenf\"ugen und Erweitern von Vektoren.}, label=vectorinsertlisting] >> a = [4 3 2 1]; >> b = [10 12 14 16]; ->> c = [a b] % erstelle einen Vektor aus einer Liste von Vektoren +>> c = [a b] % erstelle einen Vektor aus einer Liste von Vektoren c = 4 3 2 1 10 12 14 16 >> length(c) ans = 8 >> length(a) + length(b) ans = 8 + >> c = [a b']; % Vektorlayout muss uebereinstimmen Error using horzcat Dimensions of matrices being concatenated are not consistent. From 2d777c552142a27df8149286badd4789da3dd5b7 Mon Sep 17 00:00:00 2001 From: Jan Benda Date: Mon, 30 Nov 2015 10:45:13 +0100 Subject: [PATCH 17/17] Added some nice quotes. Added more TODO sections --- bootstrap/lecture/bootstrap-chapter.tex | 6 +++++ header.tex | 7 +++++ likelihood/lecture/likelihood-chapter.tex | 5 ++++ .../lecture/pointprocesses-chapter.tex | 6 +++++ programming/lecture/programming.tex | 7 +++-- programmingstyle/lecture/programmingstyle.tex | 27 +++++++++++++++---- statistics/lecture/statistics-chapter.tex | 7 +++++ 7 files changed, 56 insertions(+), 9 deletions(-) diff --git a/bootstrap/lecture/bootstrap-chapter.tex b/bootstrap/lecture/bootstrap-chapter.tex index 2b3dbe8..dc5b25b 100644 --- a/bootstrap/lecture/bootstrap-chapter.tex +++ b/bootstrap/lecture/bootstrap-chapter.tex @@ -16,4 +16,10 @@ \input{bootstrap} +\section{TODO} +\begin{itemize} +\item Proper introduction of confidence intervals +\item Proper introduction of statistical tests (significance, power, etc.) +\end{itemize} + \end{document} diff --git a/header.tex b/header.tex index 53a6386..2e3face 100644 --- a/header.tex +++ b/header.tex @@ -218,6 +218,13 @@ \newcommand{\matlab}{\texorpdfstring{MATLAB$^{\copyright}$}{MATLAB}} \newcommand{\matlabfun}[2][]{(\tr{\matlab-function}{\matlab-Funktion} \setlength{\fboxsep}{0.5ex}\colorbox{codeback}{\texttt{#2}})\ifthenelse{\equal{#1}{}}{\protect\sindex[code]{#2}}{\protect\sindex[code]{#1}}} +%%%%% shortquote and widequote commands: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% \shortquote{Something to be quoted}{Source} +\newcommand{\shortquote}[2]{\begin{list}{}{\rightmargin\leftmargin}\item\relax\itshape #1 \hfill \upshape #2\end{list}} + +% \widequote{Something to be quoted}{Source} +\newcommand{\widequote}[2]{{\itshape #1} \hfill #2} + %%%%% exercises environment: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % usage: % diff --git a/likelihood/lecture/likelihood-chapter.tex b/likelihood/lecture/likelihood-chapter.tex index bb4182a..2bcc35b 100644 --- a/likelihood/lecture/likelihood-chapter.tex +++ b/likelihood/lecture/likelihood-chapter.tex @@ -16,4 +16,9 @@ \input{likelihood} +\section{TODO} +\begin{itemize} +\item GLM model fitting? +\end{itemize} + \end{document} diff --git a/pointprocesses/lecture/pointprocesses-chapter.tex b/pointprocesses/lecture/pointprocesses-chapter.tex index f9f25a7..4570c91 100644 --- a/pointprocesses/lecture/pointprocesses-chapter.tex +++ b/pointprocesses/lecture/pointprocesses-chapter.tex @@ -16,5 +16,11 @@ \input{pointprocesses} +\section{TODO} +\begin{itemize} +\item Add spikeraster function +\item Multitrial firing rates +\end{itemize} + \end{document} diff --git a/programming/lecture/programming.tex b/programming/lecture/programming.tex index 71dc926..a999a0a 100644 --- a/programming/lecture/programming.tex +++ b/programming/lecture/programming.tex @@ -1023,6 +1023,7 @@ darum, dass es schwerwiegende Nachteile gibt: \item Fehleranf\"alligkeit: Beim ``Copy-and-paste'' kann leicht vergessen werden in einzelnen Wiederholungen die entscheidende \"Anderung auch wirklich vorzunehmen. + \shortquote{Copy and paste is a design error.}{David Parnas} \item Flexibilit\"at: Das obige Programm ist f\"ur genau einen Zweck, Berechnung der Fakult\"at von f\"unf, gemacht und kann nichts anderes. @@ -1056,16 +1057,14 @@ Schl\"usselwort \code{end} beendet. Listing \ref{looplisting} zeigt das Grundger\"ust einer for-Schleife. \begin{lstlisting}[caption={Beispiel einer \varcode{for}-Schleife.}, label=looplisting] ->> for x = 1:5 +>> for x = 1:3 x end % die Laufvariable x nimmt mit jeder Iteration der Schleife -% einen Wert des Vektors 1:5 an: +% einen Wert des Vektors 1:3 an: 1 2 3 - 4 - 5 \end{lstlisting} diff --git a/programmingstyle/lecture/programmingstyle.tex b/programmingstyle/lecture/programmingstyle.tex index 04eaa8c..abf600f 100644 --- a/programmingstyle/lecture/programmingstyle.tex +++ b/programmingstyle/lecture/programmingstyle.tex @@ -1,5 +1,9 @@ \chapter{\tr{Programming style}{Programmierstil}} +\shortquote{Any code of your own that you haven't looked at for six or + more months might as well have been written by someone + else.}{Eagleson's law} + Guter Programmierstil ist keine Frage des guten Geschmacks sondern des Verst\"andnisses von Programmcode und ein Baustein in dem Bestreben wissenschaftlichen Erkenntnisgewinn reproduzierbar zu @@ -67,7 +71,7 @@ aktuellen Ordner nach passenden Dateien sucht (mehr Information zum \matlab-Suchpfad in Box~\ref{matlabpathbox}). \begin{figure}[tp] - \includegraphics[width=0.82\textwidth]{program_organization} + \includegraphics[width=0.75\textwidth]{program_organization} \titlecaption{\label{fileorganizationfig} M\"ogliche Organisation von Programmcode im Dateisystem.}{ F\"ur jedes Projekt werden Unterordner f\"ur die einzelnen Analysen angelegt. Auf Ebene des @@ -271,6 +275,10 @@ ein v\"ollig unn\"otiger Kommentar. \item Ein falscher Kommentar ist schlimmer als gar kein Kommentar! \item Kommentare m\"ussen gepflegt werden, sonst sind sie wertlos! \end{itemize} + \widequote{Good code is its own best documentation. As you're about to add + a comment, ask yourself, ``How can I improve the code so that this + comment isn't needed?'' Improve the code and then document it to + make it even clearer.}{Steve McConnell} \end{important} \pagebreak[4] @@ -418,7 +426,16 @@ werden. Wenn diese nicht von globalem Interesse sind, kann mit \codeterm[Funktion!geschachtelte]{geschachtelten Funktionen} die \"Ubersichtlichkeit erh\"oht werden. -\noindent Es lohnt sich auf den eigenen Programmierstil zu -achten!\footnote{Buchtip: Robert C. Martin: - \textit{Clean Code: A Handbook of Agile Software Craftmanship}, - Prentice Hall} +Es lohnt sich auf den eigenen Programmierstil zu +achten!\footnote{Buchtip: Robert C. Martin: \textit{Clean Code: A + Handbook of Agile Software Craftmanship}, Prentice Hall} + +\shortquote{Programs must be written for people to read, and only + incidentally for machines to execute.}{Abelson / Sussman} + +\shortquote{Any fool can write code that a computer can + understand. Good programmers write code that humans can + understand.}{Martin Fowler} + +\shortquote{First, solve the problem. Then, write the code.}{John + Johnson} diff --git a/statistics/lecture/statistics-chapter.tex b/statistics/lecture/statistics-chapter.tex index 1a87fc8..edfdf93 100644 --- a/statistics/lecture/statistics-chapter.tex +++ b/statistics/lecture/statistics-chapter.tex @@ -16,6 +16,13 @@ \input{statistics} +\section{TODO} +\begin{itemize} +\item Proper introduction to probabilities and densities first! +\item Cumulative propability +\item Kernel Histogramms (important for convolved PSTH)! +\end{itemize} + \end{document}