From 198cc173cce8724fe13be1c2fb3889418c68fb33 Mon Sep 17 00:00:00 2001 From: Jan Grewe Date: Wed, 21 Oct 2015 13:56:36 +0200 Subject: [PATCH] add solutions for vectors and matrices --- programming/exercises/vectors_matrices.tex | 202 ++++++++++++++++++++- 1 file changed, 200 insertions(+), 2 deletions(-) diff --git a/programming/exercises/vectors_matrices.tex b/programming/exercises/vectors_matrices.tex index 517d81a..b2d91a3 100644 --- a/programming/exercises/vectors_matrices.tex +++ b/programming/exercises/vectors_matrices.tex @@ -1,4 +1,4 @@ -\documentclass[12pt,a4paper,pdftex]{exam} +\documentclass[12pt,a4paper,pdftex, answers]{exam} \usepackage[german]{babel} \usepackage{natbib} @@ -24,6 +24,7 @@ \renewcommand{\baselinestretch}{1.15} \newcommand{\code}[1]{\texttt{#1}} +\renewcommand{\solutiontitle}{\noindent\textbf{L\"osung:}\par\noindent} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \begin{document} @@ -51,12 +52,30 @@ voneinander ausf\"uhrbar sein. Das Skript sollte nach dem Muster: \question Erzeuge Vektoren mit folgendem Inhalt: \begin{parts} \part Von 1 bis 10 in ganzzahligen Schritten. + \begin{solution} + \code{a = 1:10;} + \end{solution} \part Von 0 bis 20 in 2er Schritten. + \begin{solution} + \code{a = 0:2:20;} + \end{solution} \part Mit \textbf{absteigendem} Inhalt von 100 bis 0. + \begin{solution} + \code{a = 100:-1:0;} + \end{solution} \part In 10 Schritten von 0 bis 1. + \begin{solution} + \code{a = 0:0.1:1;} + \end{solution} \part In 11 Schritten von 0 bis 1. + \begin{solution} + \code{a = 0:1/11:1;} + \end{solution} \part In 50 Schritten von 0 bis $2\pi$ ($\pi$ ist als Konstante \code{pi} in Matlab definiert). + \begin{solution} + \code{a = 0:2*pi/50:2*pi;} + \end{solution} \end{parts} \question Rechnen mit Vektoren: @@ -65,56 +84,132 @@ voneinander ausf\"uhrbar sein. Das Skript sollte nach dem Muster: \part Wie gro{\ss} ist der Vektor? Benutze die Funktionen \code{size} und \code{length}. Was ist der Unterschied zwischen den beiden Funktionen? + \begin{solution} + \code{x = [3 2 6 8]; \\ disp(length(x));\\ 4\\ disp(size(x))\\ 1 4} + \end{solution} \part Wie \"andern sich \code{size} und \code{length} des Vektors wenn er transponiert wird? + \begin{solution} + L\"ange \"andert sich nicht. R\"uckgabewert von size ist invertiert. + \end{solution} \part Addiere 5 zu jedem Element von \verb+x+. + \begin{solution} + \code{disp(x + 5)} + \end{solution} \part Multipliziere jedes Element von \code{x} mit 2; + \begin{solution} + \code{disp(x * 2)} + \end{solution} \part Definiere einen zweiten Vektor (\verb+y = [4 1 3 5];+). Stelle sicher, dass \code{x} wieder in seiner urspr\"unglichen Form ist. \part Addiere beide Vektoren \code{x + y}. + \begin{solution} + \code{y = [4 1 3 5]; \\disp(x + y)\\7 3 9 13} + \end{solution} \part Subtrahiere beide Vektoren \code{x - y}. + \begin{solution} + \code{disp(x - y)\\-1 1 3 3} + \end{solution} \part Multipliziere beide Vektoren \code{x * y}. + \begin{solution} + \code{disp(x * y)\\Error using *. Inner matrix dimension must agree.} + \end{solution} \part Erkl\"are die Fehlermeldung. + \begin{solution} + * ist der Operator f\"ur die Matrixmultiplikation. Bei dieser + muessen die inneren Dimensionen \"uebereinstimmen. + \code{disp(size(x))\\1 4 \\disp(size(y)) \\ 1 4}\\ + (m,n)*(n,o) w\"are ok. + \end{solution} \part Was m\"usste man machen, damit \code{mtimes} bzw. der \code{*} Operator funktionieren? + \begin{solution} + y m\"usste transponiert werden: \code{x * y'} + \end{solution} \part Multipliziere die Vektoren elementweise (\code{x .* y}) und weise das Ergebnis eine neuen Variablen zu. + \begin{solution} + \code{z = x .* y;} + \end{solution} \end{parts} \question Erzeugen von Vektoren mit Helferfunktionen: \begin{parts} \part Erstelle einen 100 Elemente langen Vektor mit der Funktion \code{ones} (siehe Hilfe). Was macht sie? + \begin{solution} + \code{ones(100,1)} erzeugt einen Vektor bei dem alle Elemente mit 1 gef\"ullt sind. + \end{solution} \part Erstelle einen 100 Elemente langen Vektor mit der Funktion \code{zeros}. Was macht diese? + \begin{solution} + \code{zeros(100,1)} erzeugt einen Vektor bei dem alle Elemente mit 0 gef\"ullt sind. + \end{solution} \part Erstelle einen 100 Elemente langen Vektor in dem jedes Element den Wert 4.5 hat. + \begin{solution} + \code{ones(100,1) * 4.5} + \end{solution} \part Erzeuge einen Vektor mit 100 Zufallszahlen (\code{rand}, siehe Hilfe). + \begin{solution} + \code{x = rand(100,1)} + \end{solution} \part Erzeuge einen Vektor mit 100 Werten zwischen 0 und 1 mithilfe der Funktion \code{linspace}. + \begin{solution} + \code{x = linspace(0,1,100)} + \end{solution} \end{parts} \question Indizieren in Vektoren: \begin{parts} \part Erzeuge einen Vektor mit 100 Elementen (0 - 100). + \begin{solution} + \code{x = linspace(0,100,100);} + \end{solution} \part Gib jeweils den ersten, den letzten, den 5., 24. und den vorletzten Wert aus. + \begin{solution} + \code{disp(x(1))\\ disp(x(end))\\ disp(x(5))\\ disp(x(24))\\ disp(x(end-1))} + \end{solution} \part Gib die ersten 10 Werte aus. + \begin{solution} + \code{x(1:10)} + \end{solution} \part Gib die letzten 10 Werte aus. + \begin{solution} + \code{disp(x(end-10:end))} + \end{solution} \part Versuche den Wert an der Stelle 0 auszugeben. + \begin{solution} + \code{x(0)\\ Subscript indices must either be real positive integers or logicals.} + \end{solution} \part Versuche den Wert an der Stelle 110 auszugeben. + \begin{solution} + \code{x(110)\\ Index exceeds matrix dimensions.} + \end{solution} \part Gib die Werte an den Stellen 3, 15, und 42 zusammen als Vektor aus. + \begin{solution} + \code{disp(x([3 15 42]))} + \end{solution} \part Gib 10 zuf\"allig ausgew\"ahlte Werte aus (benutze \verb+randi+ um die Indizes zu erstellen). + \begin{solution} + \code{x(randi(100,10,1))} + \end{solution} \end{parts} \question Erzeuge eine Variable und speichere etwas Text in ihr, so dass mindestens 2 Worte vorhanden sind. (z.B. \code{x = 'some text'}). Benutze die Indizierung um die W\"orter einzeln auszugeben. + \begin{solution} + \code{x = 'some text'; \\ disp(x(1:4))\\disp(x(6:end))} + \end{solution} + \newpage \section*{Matrizen} @@ -124,11 +219,29 @@ voneinander ausf\"uhrbar sein. Das Skript sollte nach dem Muster: 4 \end{array} \right) \] \begin{parts} \part Gib das Element in der 3. Zeile und 2. Spalte aus. + \begin{solution} + \code{x = [7 3 5; 1 8 3; 8 6 4];\\x(3,2)} + \end{solution} \part Gib jeweils alle Elemente der 1., 2. und 3. Zeile aus. + \begin{solution} + \code{x([1 2 3],:);} + \end{solution} \part Gib jeweils alle Elemente der 1., 2., und 3. Spalte aus. + \begin{solution} + \code{disp(x(:, 1))\\ disp(x(:, 2))\\ disp(x(:, 3))} + \end{solution} \part Erh\"ohe das Element in der 2. Zeile und 3. Spalte um Eins. + \begin{solution} + \code{x(2,3) = x(2,3) + 1;} + \end{solution} \part Ziehe von allen Elementen der 1. Zeile 5 ab. + \begin{solution} + \code{x(1,:) = x(1,:) - 5;} + \end{solution} \part Multipliziere alle Elementen der 3. Spalte mit 2. + \begin{solution} + \code{x(:,3) = x(:,3) * 2;} + \end{solution} \end{parts} \question Erstelle eine $5 \times 5$ Matrix \code{M} die @@ -136,19 +249,57 @@ voneinander ausf\"uhrbar sein. Das Skript sollte nach dem Muster: \verb+randn()+. Benutze die Hilfe: Was macht die Funktion?). \begin{parts} \part Gib das Element in der 2. Zeile und 3. Spalte aus. + \begin{solution} + \code{disp(M(2,3))} + \end{solution} + \part Gib jeweils alle Elemente der 1., 3. und letzten Zeile aus. + \begin{solution} + \code{disp(M(1,:)) \\ disp(M(3,:))\\ disp(M(size(M,1), :))} + \end{solution} + \part Gib jeweils alle Elemente der 2. und 4. Spalte aus. + \begin{solution} + \code{disp(M(:,2))\\ disp(M(:,4))} + \end{solution} + \part Greife mit einem einzigen Kommando auf die Elemente jeder zweiten Spalte zu und speichere die Daten in einer neuen Variable. + \begin{solution} + \code{y = M(:, [2:2:size(M,2)])} + \end{solution} + \part Berechne jeweils den Mittelwert der 1., 3. und 5. Zeile (Funktion \code{mean}, siehe Hilfe). + \begin{solution} + \code{mean(M([1 3 5],:), 2)} + \end{solution} + \part Berechne die Summe aller Werte der 2. und 4. Spalte (Funktion \code{sum}, siehe Hilfe). - \part Berechne die Summer aller Elemente der Matrize. + \begin{solution} + \code{sum(M(:, [2 4]), 1)} + \end{solution} + + \part Berechne die Summe aller Elemente der Matrize. + \begin{solution} + \code{sum(M(:))} + \end{solution} + \part Ersetze die Elemente der 2. Zeile mit denen der 4. + \begin{solution} + \code{M(2,:) = M(4,:)} + \end{solution} + \part F\"uhre folgendes Kommando aus: \code{M(1:2,1) = [1, 2, 3]}. Was k\''onnte die Absicht dieses Codes gewesen sein? Was bedeutet die Fehlermeldung? + \begin{solution} + \code{M(1:2,1) = [1, 2,3];\\ Subscripted assignment dimension + mismatch.} \\ Der einzuf\"ugende Vektor hat 3 Elemente, die + Auswahl von M in die geschrieben werden soll hat nur die + Gr\"o{\ss}e 2; + \end{solution} \end{parts} \question Matrizen k\"onnen neben der ``normalen'' @@ -158,12 +309,28 @@ voneinander ausf\"uhrbar sein. Das Skript sollte nach dem Muster: \begin{parts} \part Erstelle eine 2-D Matrix mit Zufallszahlen mit der Dimensionalit\"at \verb+[10,10]+. + \begin{solution} + \code{x = randn(10, 10)} + \end{solution} + \part Wie viele Werte enth\"alt sie? + \begin{solution} + 100 + \end{solution} + \part Benutze das lineare Indizieren um 50 zuf\"allige Werte auszuw\"ahlen. + \begin{solution} + \code{x(randi(100, 50, 1)])} + \end{solution} + \part Wo liegt der Vorteil gegen\"uber der \textit{subscript} Indizierung? \part Berechne die Summe aller Werte mit einem Funktionsaufruf.. + \begin{solution} + \code{sum(x(:))} oder \code{sum(sum(x))} + \end{solution} + \end{parts} \question Erstelle folgende Variablen \verb+x = [1 5 9]+ and @@ -172,11 +339,35 @@ voneinander ausf\"uhrbar sein. Das Skript sollte nach dem Muster: sie nicht? Teste Deine Vorhersagen. \begin{parts} \part \code{x + y} + \begin{solution} + Funktioniert! + \end{solution} + \part \code{x * M} + \begin{solution} + Matrixmultiplikation Funktioniert nicht! Inner dimensions must agree! + \end{solution} + \part \code{x + y'} + \begin{solution} + Funktioniert nicht! Die Dimensionalit\"aten passen nicht. + \end{solution} + \part \code{M - [x y]} + \begin{solution} + Funktioniert nicht! \code{[x y] ist ein Zeilenvektor der L\"ange + 6, M ist eine Martix.} + \end{solution} + \part \code{[x; y]} + \begin{solution} + Funktioniert! Gr\"o{\ss}e: 2 3 + \end{solution} + \part \code{M - [x; y]} + \begin{solution} + Funktioniert! + \end{solution} \end{parts} \question Erstelle eine 3-D Matrix aus drei 2-D Matrizen. Benutze @@ -184,6 +375,9 @@ voneinander ausf\"uhrbar sein. Das Skript sollte nach dem Muster: nach, wie sie benutzt wird). \begin{parts} \part Gib alle Elemente des ersten ``Blattes'' aus (Index 1 der 3. Dimension). + \begin{solution} + \code{x = randn(5,5); \\y = randn(5, 5);\\ z = cat(3, x, y);\\disp(z(:,:,1))} + \end{solution} \end{parts} \question Erzeuge eine $5 \times 5 \times 5$ Matrix die mit @@ -192,6 +386,10 @@ voneinander ausf\"uhrbar sein. Das Skript sollte nach dem Muster: \begin{parts} \part Berechne den Mittelwert aller Bl\"atter dieser Matrix (benutze \verb+mean()+, siehe Hilfe). + \begin{solution} + \code{x = rand(5,5,5) .* 100;\\ disp(mean(mean(x(:,:,1))))\\ disp(mean(mean(x(:,:,2)))) \\ disp(mean(mean(x(:,:,3))))} + \end{solution} + \end{parts} \end{questions}