===== Forendiskussionen ===== * [[https://fsi.informatik.uni-erlangen.de/forum/thread/8754-LOeSUNGSVERSUCH-Klausur-5-August-2011]] Gesamte Klausur ===== Lösungsversuch ===== ==== Aufgabe 1 - Komplexität ==== **a)** O(n²) **b)** O(n) **c)** O(n³) **d)** O(n) **e)** O(n²) **f)** O(n) **g)** O(h²) **h)** O(h^4) ==== Aufgabe 2 - Speicherung dünn besetzter Matrizen ==== **a)** val = 2, 3, -4, 7, 3, 2, 8, 1, -3 row_idx = 2, 3, 4, 1, 2, 3, 1, 3, 4 col_ptr = 0, 0, 3, 6, 9, 9 **b)** Die Transponierung kann sehr einfach erreicht werden, indem man die bestehenden Arrays als CRS-Format interpretiert. val_trans = val col_idx = row_idx row_ptr = col_ptr **c)** |0 4 0 0| |0 0 0 0| |0 0 3 2| |0 2 1 4| |0 0 0 0| ==== Aufgabe 3 - LU-Zerlegung ==== **a)** |1 0 0| L = |2 1 0| |-2 3 1| |2 1 4| U = |0 1 1| |0 0 2| **b)** x = (-10, 6, -3/2, -1)^T ==== Aufgabe 4 - Least-Square Approximation ==== **a)** |1 -1 1| A = |0 0 1| |1 1 1| |4 2 1| u = (a, b, c)^T b = (1, -2, -1, 2)^T **b)** |14 5 -2| |c| |7| | 5 5 0| x |b| = |7| |-2 0 5| |a| |3| **c)** QR-Zerlegung ==== Aufgabe 5 - Hauptkomponentenanalyse ==== **a)** |28/5 18/5| |18/5 16/5| **b)** 1. Hauptachse: (-1, 1)^T 2. Hauptachse: (1, 1)^T ==== Aufgabe 6 - Programmierung: Polynominterpolation ==== **a)** Matrix MonomialCurve::getCoefficientMatrix() const { int cp = getNumControlPoints(); Matrix m(cp, cp); std::vector& p = getControlPoints(); for(int r = 0; r < cp; r++) { m(r, 0) = 1; for(int c = 0; c < cp; c++) m(r, c) = m(r, c-1) * p(r).x; } } **b)** float MonomialCurve::evaluateAt(const Matrix% coeff, const float x) const { int h = getNumControlPoints(); float result = coeff(h-1, 0); for(int i = h - 2; i >= 0; i--) { result = result * x + coeff(i, 0); } return result; } **c)** Matrix NewtonCurve::getCoefficientMatrix() const { int cp = getNumControlPoints(); Matrix m(cp, cp); m.setZero(); std::vector& p = getControlPoints(); for(int r = 0; r < cp; r++) { m(r, 0) = 1; for(int c = 1; c < r; c++) m(r, c) = m(r, c-1) * (p(r).x - p(c-1).x); } } **d)** float NewtonCurve::evaluateAt(const Matrix% coeff, const float x) const { int h = getNumControlPoints(); float result = coeff(h-1, 0); std:vector& p = getControlPoints(); for(int i = h - 2; i >= 0; i--) { result = result * (x - p(i).x) + coeff(i, 0); } return result; } ==== Aufgabe 7 - Programmierung: Bildbearbeitung ==== **a)** void computeDerivativeX(const Image& image, Image& result) { int dim = image.getDimension(); for(int r = 0; r < dim; r++) { for(int c = 0; c < dim; c++) { prev = (c == 0) ? c : c - 1; next = (c == dim - 1) ? c : c + 1; result(r, c) = -2 * image(r, c) + image(r, prev) + image(r, next); } } } **b)** void computeLaplacian(const Image& image, Image& result) { int dim = image.getDimensions(); Image derivX(dim); Image derivY(dim); computeDerivativeX(image, derivX); computeDerivativeY(image, derivY); for(int r = 0; r < dim; r++) { for(int c = 0; c < dim; c++) { result(r, c) = derivX(r,c) + derivY(r, c); } } } **c)** (Sehr unsicher -> zu Überprüfen) void solveLaplacianEquation(Image& image, const Image& mask, unsigned int iterations) { int dim = image.getDimension(); Image result; Image laplacian; computeLaplacian(image, laplacian); for (unsigned int i = 0; i < iterations; i++) { for (int r = 1; r + 1 < dim; r++) { for (int c = 1; c + 1 < dim; c++) { if (mask(r, c) == 0.0f) continue; float tmp = laplacian(r, c); tmp = tmp - result(r - 1, c ) - result(r + 1, c ) - result(r , c - 1) - result(r , c + 1); tmp = tmp / (-4.f); result(r, c) = tmp; } } } } ==== Aufgabe 8 - Nichtlineare Optimierung ==== **a)** Zum Beispiel: s_1 = (1, 0)^T s_2 = 1/sqrt(2) * (1, 1)^T **b)** s_0 = (-2, 0)^T t_0 = 1/2 x_1 = (0, 1)^T **c)** x_i+1 = (0, 3)^T **d)** Mit jedem Iterationsschritt nimmt die Genauigkeit des Ergebnisses um die Potenz 2 zu. |x_i+1 - x_exact| <= c * |x_i x_exact|^2 ==== Aufgabe 9 - Interpolation ==== **a)** { 5/4 x + 5/2 für -2 <= x < 0 L(x) = { 3/4 x + 5/2 für 0 <= x < 2 { 1/4 x + 7/2 für 2 <= x < 4 **b)** y_1' = 1 y_2' = 1/2 **c)** P_1: ρ = 2/3, σ = 0, τ = 1/3 P_2: ρ = 0, σ = 0, τ = 1 P_3: ρ = 1/3, σ = 1/2, τ = 1/6 **d)** α_R = α_S = α_T = 1/3 f_pR = 12 f_pS = 56 f_pT = 48 f_p = ρ * f_pR + σ * f_pS + τ * f_pT = 40 Hinweis: Bei den Baryzentrischen Koordinaten handelt es sich um die des Punktes P_3 aus Teilaufgabe c)! ==== Aufgabe 10 - Bézier-Kurven ==== **a)** (19/2, 14)^T **b)** c_0 = (0, 32)^T c_1 = (0, 16)^T c_2 = (16, 8)^T c_3 = (28, 8)^T d_0 = (28, 8)^T d_1 = (40, 8)^T d_2 = (48, 16)^T d_3 = (32, 32)^T **c)** DeCasteljau und Midpoint Subdivision grafisch. **d)** b_0 = (32, -4)^T b_1 =(0, -4)^T b_2 =(0, -68)^T b_3 =(32, -36)^T **e)** --fehlt--