loops done
This commit is contained in:
parent
566d82cd6b
commit
f8e09400a2
6
programming/code/facultyLoop.m
Normal file
6
programming/code/facultyLoop.m
Normal file
@ -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)
|
2
programming/code/facultyLoop.out
Normal file
2
programming/code/facultyLoop.out
Normal file
@ -0,0 +1,2 @@
|
||||
>> facultyLoop
|
||||
Faculty of 5 is: 120
|
7
programming/code/facultyWhileLoop.m
Normal file
7
programming/code/facultyWhileLoop.m
Normal file
@ -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)
|
6
programming/code/neverendingWhile.m
Normal file
6
programming/code/neverendingWhile.m
Normal file
@ -0,0 +1,6 @@
|
||||
i = 1;
|
||||
while true % this is always true
|
||||
disp(x);
|
||||
x = x * i;
|
||||
i = i + 1;
|
||||
end
|
@ -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,71 +811,115 @@ 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}
|
||||
|
||||
|
||||
|
@ -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
|
||||
|
Reference in New Issue
Block a user