diff --git a/programming/code/facultyLoop.m b/programming/code/facultyLoop.m new file mode 100644 index 0000000..ba14622 --- /dev/null +++ b/programming/code/facultyLoop.m @@ -0,0 +1,6 @@ +n = 5; +x = 1; +for i = 1:n + x = x * i; +end +fprintf('Faculty of %i is: %i\n', n, x) \ No newline at end of file diff --git a/programming/code/facultyLoop.out b/programming/code/facultyLoop.out new file mode 100644 index 0000000..192c318 --- /dev/null +++ b/programming/code/facultyLoop.out @@ -0,0 +1,2 @@ +>> facultyLoop +Faculty of 5 is: 120 \ No newline at end of file diff --git a/programming/code/facultyWhileLoop.m b/programming/code/facultyWhileLoop.m new file mode 100644 index 0000000..8f718d1 --- /dev/null +++ b/programming/code/facultyWhileLoop.m @@ -0,0 +1,7 @@ +n = 5; +counter = 1; +x = 1; +while counter <= n + x = x * counter; +end +fprintf('Faculty of %i is: %i\n', n, x) \ No newline at end of file diff --git a/programming/code/neverendingWhile.m b/programming/code/neverendingWhile.m new file mode 100644 index 0000000..e3999e9 --- /dev/null +++ b/programming/code/neverendingWhile.m @@ -0,0 +1,6 @@ +i = 1; +while true % this is always true + disp(x); + x = x * i; + i = i + 1; +end \ No newline at end of file diff --git a/programming/lectures/programming.tex b/programming/lectures/programming.tex index 52724ec..4a15511 100644 --- a/programming/lectures/programming.tex +++ b/programming/lectures/programming.tex @@ -784,7 +784,7 @@ nun die Werte an den Stellen zur\"uck, an denen der logische Vektor In der Regel wird ein Programm Zeile f\"ur Zeile von oben nach unten ausgef\"uhrt. Manchmal muss der Kontrollfluss aber so gesteuert werden, dass bestimmte Teile des Programmcodes wiederholt oder nur -unter bestimmten Bedingungen ausgef\"uhrt werden. Von gro[\ss]er +unter bestimmten Bedingungen ausgef\"uhrt werden. Von gro{\ss}er Bedeutung sind hier zwei Strukturen: \begin{enumerate} @@ -799,7 +799,7 @@ zu vereinfachen. In einer \"Ubung wurde die Fakult\"at von 5 wie in Listing \ref{facultylisting1} berechnet: \begin{lstlisting}[caption={Berechnung der Fakult\"at von 5 in f\"unf - Schritten}, label=facultylisting1] + Schritten}, label=facultylisting] >> x = 1; >> x = x * 2; >> x = x * 3; @@ -811,69 +811,113 @@ x = \end{lstlisting} Im Prinzip ist das obige Programm v\"ollig in Ordnung. Es f\"allt -jedoch auf, dass die Zeilen 2 bis 5 sehr \"ahnlich sind und +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 +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. +\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 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. +\end{enumerate} - \begin{itemize} - \item Zeilen 2 bis 5 sind sehr \"ahnlich. - \item Die Verwendung von solchen Codeklonen ist schlechter Programmierstil! - \item Welche Nachteile hat es sonst noch? - \end{itemize} +Alle Programmiersprachen bieten zur L\"osung dieses Problems die +Schleifen. Eine Schleife wird immer dann eingesetzt, wenn man +Abschnitte wiederholt ausf\"uhren will. + +\subsubsection{\textbf{for}- Schleife} + +Der am h\"aufigsten benutzte Vertreter der Schleifen ist die +\textit{for-Schleife}. Sie besteht aus dem \textit{Schleifenkopf} und +dem \textit{Schleifenk\"orper}. Der Kopf regelt, wie h\"aufig der Code +im K\"orper ausgef\"uhrt wird. + +\begin{definition} + Der Schleifenkopf beginnt mit dem Schl\"usselwort \textbf{for} auf + welches folgend die \textit{Laufvariable} definiert wird. In \matlab + ``l\"auft''/iteriert eine for-Schleife immer(!) \"uber einen + Vektor. Die \textit{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 \textbf{end} beendet. Listing \ref{looplisting} +\end{definition} + +\begin{lstlisting}[caption={Beispiel einer \textbf{for} Schleife. Die Laufvariable \code{x} nimmt mit jeder Iteration der Schleife einen Wert des Vektors \code{1:5} an.}, label=looplisting] +for x = 1:5 + % ... etwas sinnvolles mit x ... +end +\end{lstlisting} +\begin{exercise}{facultyLoop.m}{facultyLoop.out} + Wie k\"onnte Fakult\"at mit einer Schleife implementiert werden? + Implementiere eine for Schleife, die die Fakul\"at von einer Zahl + \code{n} berechnet. +\end{exercise} - \begin{itemize} - \item Wird genutzt um iterativ/wiederholt einen Codeabschnitt auszuf\"uhren.\pause - \item Eine \code{for} Schleife besteht aus dem \textit{(Schleifen-) Kopf} und dem \textit{(Schleifen-) K\"orper}. - \begin{itemize} - \item Der Schleifenkopf beginnt mit dem Schl\"usselwort - \textbf{for} auf welches folgend die \textit{Laufvariable} - definiert wird. - \item Die Schleife ``l\"auft''/iteriert immer(!) \"uber einen - Vektor. - \item Die \textit{Laufvariable} nimmt in jeder Iteration einen - Wert dieses Vektors an. - \item Im Schleifenk\"orper k\"onnen beliebige Anweisungen - ausgef\"uhrt werden. - \item Die Schleife wird durch das Schl\"usselwort \textbf{end} - beendet. - \end{itemize} - \end{itemize} - \begin{lstlisting}[label=loopListing2] - for x = 1:5 - % ... etwas sinnvolles mit x ... - end - \end{lstlisting} +\subsubsection{Die \textbf{while}-Schleife} +Eine weiterer Schleifentyp, der weniger h\"aufig eingesetzt wird, ist +die \textot{while}-Schleife. Auch sie hat ihre Entsprechungen in fast +allen Programmiersprachen. \"Ahnlich zur \code{for} Schleife wird +auch hier der in der Schleife definierte Programmcode iterative +ausgef\"uhrt. +\begin{definition} + Der Schleifenkopf beginnt mit dem Schl\"usselwort \textbf{while} + gefolgt von einem \underline{Booleschen Ausdruck}. Solange dieser zu + \textit{true} ausgewertet werden kann, wird der Code im + Schleifenk\"orper ausgef\"uhrt. Die Schleife wird mit dem + Schl\"usselwort \textbf{end} beendet. +\end{definition} - Zur\"uck zu unserer Implementation der Fakult\"at: - \begin{lstlisting} ->> x = 1; ->> x = x * 2; ->> x = x * 3; ->> x = x * 4; ->> x = x * 5; ->> x -x = - 120 -\end{lstlisting} -\normalsize -Wie k\"onnte das in einer Schleife gel\"ost werden? - - - Implementatierung der Fakult\"at mithilfe einer \code{for} Schleife: - \begin{lstlisting} - x = 1; - for i = 1:5 - x = x * i; - end - % oder auch - iterations = 1:5; - for i = iterations - x = x * i; - end + +\begin{lstlisting}[caption={Grundstruktur einer \textbf{while} Schleife.}, label=whileloop] +while x == true + % fuehre diesen sinnvollen code aus ... +end \end{lstlisting} + + +\begin{exercise}{facultyWhileLoop.m}{} + Implementiere die Fakult\"at mit einer \textbf{while}-Schleife. +\end{exercise} + + +\begin{exercise}{neverendingWhile.m}{} + Implementiere eine \textbf{while}-Schleife, die unendlich + l\"auft. Tipp: der Boolesche Ausdruck hinter dem \textbf{while} muss + immer zu wahr ausgewertet werden. +\end{exercise} + + +\subsubsection{Vergleich \textbf{for} und \textbf{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 + betreten. +\item Der K\"orper einer \code{while} Schleife wird nur dann betreten, + wenn die Bedinung im Kopf \textbf{true} ist. \\$\rightarrow$ auch + ``Oben-abweisende'' Schleife genannt. +\item Die \code{for} Schleife eignet sich f\"ur F\"alle in denen f\"ur + jedes Element eines Vektors der Code ausgef\"uhrt werden soll. +\item Die \code{while} Schleife ist immer dann gut, wenn nicht klar + ist wie h\"aufig etwas ausgef\"uhrt werden soll. Sie ist + speichereffizienter. +\item Jedes Problem kann mit beiden Typen gel\"ost werden. +\end{itemize} \subsection{Bedingte Anweisungen und Verzweigungen} diff --git a/spike_trains/lecture/psth_sta.tex b/spike_trains/lecture/psth_sta.tex index 404b34a..96e5d71 100644 --- a/spike_trains/lecture/psth_sta.tex +++ b/spike_trains/lecture/psth_sta.tex @@ -17,7 +17,7 @@ modellieren. Die Analyse von Spiketrains beinhaltet demnach einige der Methoden, die auch f\"r die Beschreibung von Punktprozessen angewandt werden. Dar\"uber hinaus wird versucht die Beziehung zwischen der -zeitabh\"aengigen neuronalen Antwort und dem zugrundeliegenden +zeitabh\"angigen neuronalen Antwort und dem zugrundeliegenden Stimulus zu analysieren. \section{Darstellung der zeitabh\"angigen Feuerrate} @@ -34,12 +34,13 @@ Nachteile. Im folgenden werden die drei Methoden aus Abbildung \begin{figure} \includegraphics[width=\columnwidth]{psth_comparison} - \caption{\textbf{Verschiedene Methoden das PSTH zu bestimmen. A)} - Rasterplot einer einzelnen neuronalen Antwort. Jeder vertikale - Strich notiert den Zeitpunkt eines Aktionspotentials. \textbf{B)} - PSTH aus der instantanen Feuerrate bestimmt. \textbf{C)} PSTH mit - der Binning Methode. \textbf{D)} Feuerrate durch Faltung mit einem - Gauss Kern bestimmt.}\label{psthfig} + \caption{\textbf{Verschiedene Methoden die zeitabh\"angige Feuerrate + zu bestimmen. 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} \end{figure} @@ -47,10 +48,10 @@ Nachteile. Im folgenden werden die drei Methoden aus Abbildung Ein sehr einfacher Weg, die zeitabh\"angige Feuerrate zu bestimmen ist die sogenannte \textit{instantane Feuerrate}. Dabei wird die Feuerrate aus dem Kehrwert des \textit{Interspike Intervalls}, der Zeit zwischen -zwei aufeinander folgenden Aktionspotentialen (Abbildung \ref{isipsth} -A), bestimmt. Die abgesch\"atzte Feuerrate (Abbildung \ref{isipsth} B) +zwei aufeinander folgenden Aktionspotentialen (Abbildung \ref{instrate} +A), bestimmt. Die abgesch\"atzte Feuerrate (Abbildung \ref{instrate} B) ist g\"ultig f\"ur das gesammte Interspike Intervall -\ref{isipsth}. Diese Methode hat den Vorteil, dass sie sehr einfach zu +\ref{instrate}. 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 @@ -60,13 +61,13 @@ Aktionspotentiale generiert wurden. \begin{figure}[!htb] \includegraphics[width=\columnwidth]{isi_method} - \caption{\textbf{Bestimmung des PSTH aus dem Interspike - Interval. A)} Skizze eines Rasterplots einer einzelnen - neuronalen Antwort. Jeder vertikale Strich notiert den Zeitpunkt - eines Aktionspotentials. Die Pfeile zwischen aufeinanderfolgenden - Aktionspotentialen illustrieren das Interspike - Interval. \textbf{B)} Der Kehrwert des Interspike Intervalls ist - die Feuerrate.}\label{isipsth} + \caption{\textbf{Bestimmung des zeitabh\"angigen Feuerrate aus dem + Interspike Interval. A)} Skizze eines Rasterplots einer + einzelnen neuronalen Antwort. Jeder vertikale Strich notiert den + Zeitpunkt eines Aktionspotentials. Die Pfeile zwischen + aufeinanderfolgenden Aktionspotentialen illustrieren das + Interspike Interval. \textbf{B)} Der Kehrwert des Interspike + Intervalls ist die Feuerrate.}\label{instrate} \end{figure} @@ -99,9 +100,10 @@ koninuierliche Funktion. \paragraph{Faltungsmethode} -Bei der Faltungsmethode geht man etwas anders vor. Die -Aktionspotentialfolge wird ``bin\"ar'' dargestellt. Das heisst, dass -eine Antwort als Vektor dargestellt wird, in welchem die Zeitpunkte der +Bei der Faltungsmethode geht wird etwas anders vorgegangen um die +Feuerrate zeitaufgel\"ost zu berechnen. Die Aktionspotentialfolge wird +zun\"achst ``bin\"ar'' dargestellt. Das heisst, dass eine Antwort als +(Zeit-)Vektor dargestellt wird, in welchem die Zeitpunkte der Aktionspotentiale als 1 notiert werden. Alle anderen Elemente des Vektors sind 0. Anschlie{\ss}end wir dieser bin\"are Spiketrain mit einem Gauss Kern bestimmter Breite gefaltet. @@ -109,9 +111,9 @@ einem Gauss Kern bestimmter Breite gefaltet. \[r(t) = \int_{-\infty}^{\infty}d\tau \omega(\tau)\rho(t-\tau) \], 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{convpsth} A). Wenn der Kern richtig normiert +ersetzt (Abbildung \ref{convrate} A). Wenn der Kern richtig normiert wurde (Integral 1), ergibt sich die Feuerrate direkt aus der -\"Uberlagerung der Kerne (Abb. \ref{convpsth} B). Die Faltungsmethode +\"Uberlagerung der Kerne (Abb. \ref{convrate} B). Die Faltungsmethode f\"uhrt, anders als die anderen Methoden, zu einer kontinuierlichen Funktion was f\"ur spektrale Analysen von Vorteil sein kann. Die Wahl der Kernbreite bestimmt, \"ahnlich zur Binweite, die zeitliche @@ -126,17 +128,18 @@ relevante Zeitskala. Faltung werden die mit einer 1 notierten Aktionspotential durch den Faltungskern ersetzt. \textbf{B)} Bei korrekter Normierung des Kerns ergibt sich die Feuerrate direkt aus der \"Uberlagerung der - Kerne.}\label{convpsth} + Kerne.}\label{convrate} \end{figure} \section{Spike triggered Average} -Die graphischer Darstellung der Feuerrate reicht nicht aus um den -Zusammenhang zwischen neuronaler Antwort und einem Stimulus zu -analysieren. Eine Methode mehr \"uber diesen zu erfahren ist der -Spike triggered average (STA). Der STA ist der mittlere Stimulus, der -zu einem Aktionspotential in der neuronalen Antwort f\"uhrt. +Die graphischer Darstellung der Feuerrate allein reicht nicht aus um +den Zusammenhang zwischen neuronaler Antwort und einem Stimulus zu +analysieren. Eine Methode mehr \"uber diesen Zusammenhang zu erfahren +ist der Spike triggered average (STA). Der STA ist der mittlere +Stimulus, der zu einem Aktionspotential in der neuronalen Antwort +f\"uhrt. \begin{equation} STA(\tau) = \frac{1}{\langle n \rangle} \left\langle \displaystyle\sum_{i=1}^{n}{s(t_i - \tau)} \right\rangle