diff --git a/programming/lecture/data_acquisition.py b/programming/lecture/data_acquisition.py new file mode 100644 index 0000000..1c6d24e --- /dev/null +++ b/programming/lecture/data_acquisition.py @@ -0,0 +1,27 @@ +import matplotlib.pyplot as plt +import numpy as np + + +fig = plt.figure() +ax = fig.add_subplot(111) +y = np.asarray([-10, 10]) * 2.**16/20. +ax.plot([-10, 10], y, color='dodgerblue', lw=1.5) +ax.set_xlabel('measured voltage [V]') +ax.set_ylabel('digitized value') +ax.set_xlim([-10.05, 10.05]) +ax.set_ylim([-2**15, 2**15 + 1]) +ax.spines["right"].set_visible(False) +ax.spines["top"].set_visible(False) +ax.yaxis.set_ticks_position('left') +ax.xaxis.set_ticks_position('bottom') +ax.xaxis.linewidth=2 +ax.yaxis.linewidth=2 +ax.tick_params(direction="out", width=1.25) +ax.tick_params(direction="out", width=1.25) +ax.grid() +fig.set_facecolor("white") +fig.set_size_inches(5., 5.) +fig.tight_layout() +fig.savefig("images/data_acquisition.pdf") + +plt.close() diff --git a/programming/lecture/logicalIndexingTime.py b/programming/lecture/logicalIndexingTime.py index 72c1281..2a4b3e1 100644 --- a/programming/lecture/logicalIndexingTime.py +++ b/programming/lecture/logicalIndexingTime.py @@ -3,6 +3,9 @@ import numpy as np from IPython import embed time = np.arange(0.,10., 0.001) x = np.random.randn(len(time)) +f = np.ones(300)/300 +x = np.convolve(x, f, mode='same') + selection = x[(time > 5.) & (time < 6.)] fig = plt.figure() diff --git a/programming/lecture/programming.tex b/programming/lecture/programming.tex index 336c129..180204d 100644 --- a/programming/lecture/programming.tex +++ b/programming/lecture/programming.tex @@ -145,18 +145,39 @@ unterschiedlichem Speicherbedarf und Wertebreich. \end{table} \matlab{} arbeitet meist mit dem ``double'' Datentyp wenn numerische Daten gespeichert werden. Dennoch lohnt es sich, sich ein wenig mit -den Datentypen auseinanderzusetzen. Ein Szenario, dass in der -Neurobiologie nicht selten ist, ist, dass wir die elektrische -Aktivit\"at einer Nervenzelle messen. Die gemessenen Spannungen werden -mittels Messkarte digitalisiert und auf dem Rechner -gespeichert. Typischerweise k\"onnen mit solchen Messkarten Spannungen -im Bereich $\pm 10$\,V gemessen werden. Die Aufl\"osung der Wandler -betr\"agt heutzutage meistens 16 bit. Das heisst, dass der gesamte -Spannungsbereich in $2^{16}$ Schritte aufgeteilt ist. Um Speicherplatz -zu sparen w\"are es sinnvoll, die gemessenen Daten als ``int16'' Werte im -Rechner abzulegen. Die Daten als ``echte'' Spannungen, also als -Flie{\ss}kommawerte, abzulegen w\"urde den 4-fachen Speicherplatz -ben\"otigen. +den Datentypen auseinanderzusetzen (Box \ref{daqbox}). + +\begin{ibox}[tp]{Digitalisierung von Messdaten}\label{daqbox} + Szenario: Die elektrische Aktivit\"at (z.B. die Membranspannung) + einer Nervenzelle wird gemessen. Die gemessene Spannung wird mittels + Messkarte digitalisiert und auf dem Computer f\"ur weitere Analysen + gespeichert. Typischerweise k\"onnen mit solchen Messkarten + Spannungen im Bereich $\pm 10$\,V gemessen werden. Die Aufl\"osung + der Analog-Digitalwandler betr\"agt heutzutage meistens 16 bit. Das + heisst, dass der gesamte Spannungsbereich in $2^{16}$ Schritte + eingeteilt ist. Die gemessenene Spannung wird auf digitalisierte + Werte abgebildet.\vspace{0.25cm} + + \begin{minipage}{0.5\textwidth} + \includegraphics[width=0.9\columnwidth]{images/data_acquisition} + \end{minipage} + \begin{minipage}{0.5\textwidth} + Um die Spannung auf den \code{int16} Datentyp abzubilden: + \[ y = x \cdot 2^{16}/20\] mit $x$ der gemessenen Spannung und $y$ + dem digitalisierten Wert bei einem Spannungsbereich von + $\pm10$\,V.\\ + Durch Umgekehrung kann der digitalisierte Wert wieder + in eine Spannung zur\"uckgewandelt werden: + \[ x = y \cdot 20/2^{16} \] + \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, + abzulegen ben\"otigt den 4-fachen Speicherplatz und bietet keine + zus\"atzliche Information. + +\end{ibox} \section{Vektoren und Matrizen} @@ -443,7 +464,7 @@ Helferfunktionen, die n-dimensionale Matrizen erstellen k\"onnen mehrdimensionale Matrizen zusammenzuf\"ugen hilft die \code{cat} Funktion. -Um Informationen \"uber die Gr\"{\ss}e einer Matrize zu bekommen ist +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. @@ -454,7 +475,7 @@ Matrizen geht, wird \code{size} benutzt. wird durch einen Index individuell angesprochen. Der Index setzt sich aus so vielen Zahlen zusammen wie es Dimensionen gibt (links 2, rechts 3). Dabei steht die 1. Stelle immer f\"ur die Zeile, die - 2. f\"uer die Spalte und die dritte f\"ur das Blatt, + 2. f\"ur die Spalte und die dritte f\"ur das Blatt, etc.. }\label{matrixindexingfig} \end{figure} @@ -492,12 +513,12 @@ Dimensionalit\"at der Matrize ist. Diese Art des Zugriffs wird Alternativ zum \textit{subscript indexing} k\"onnen die Zellen einer Matrize auch \textit{linear} angesprochen werden (Abbildung \ref{matrixlinearindexingfig}). Diese Art der Adressierung ist nicht -so intuituiv verst\"andlich, kann aber sehr hilfreich sein. Der +so intuitiv verst\"andlich, kann aber sehr hilfreich sein. Der ``linare'' Index einer Zelle reicht von 1 bis \code{numel(M)} Elemente. Wobei dieser erst entlang der 1. Dimension, dann der 2., 3. etc. Dimension ansteigt. Listing \ref{matrixLinearIndexing} zeigt -ein Beispiel fuer den Einsatz des linearen Indexierens z.B. wenn man -den Minimalwert aller Elemente einer Matrize ermitteln m\"ochte.. +ein Beispiel f\"ur den Einsatz des linearen Indexierens z.B. wenn man +den Minimalwert aller Elemente einer Matrize ermitteln m\"ochte. \begin{figure} \includegraphics[width=0.9\columnwidth]{matrixLinearIndexing} @@ -747,8 +768,8 @@ nun die Werte an den Stellen zur\"uck, an denen der logische Vektor \end{exercise} Logisches Indizieren wurde oben so benutzt, dass die Auswahl -auf dem Inhalt desselben Vektors beruhte. Ein sehr h\"auiger Fall ist -jedoch, dass man die Auswahl aus einem Vektor auf den Inhalt eines +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