======================== Ungeblockte LU-Zerlegung [TOC] ======================== Bei der ungeblockten LU-Zerlegung mit partieller Pivotisierung soll die $m \times n$ Matrix $A$ mit der Zerlegung kompakt überschrieben werden. Die Zeilenvertauschungen sollen in einem Pivot-Vektor festgehalten werden. Nur wenn die Matrix $U$ bei der Faktorisierung *exakt* singulär ist, soll das Verfahren abbrechen. In diesem Fall soll die Funktion den kleinsten Index $i$ mit $U(i,i)$ zurückliefern. Andernfalls wird durch einen Rückgabewert $-1$ signalisiert, dass die Zerlegung erfolgreich durchgeführt werden konnte. Aufgabe ======= Implementiert die ungeblockte LU-Zerlegung _hpc::ulmlapack::getf2_ nach dem in der Vorlesung vorgestellten Algorithmus. Dabei seien die Matrizen aber bei Null beginnend indiziert: ---- BOX ----------------------------------------------------------------------- = $mn \leftarrow \min\{m, n\}$ = $\text{For}\; j=0,\dots,mn$ = $i:\;|x_i| = \max_{k = j,\dots,m-1} |x_k|$ = $\text{If}\; i \neq j$ = $A_{i,k} \leftrightarrow A_{j,k} \quad (0\leq k < n)$ = $p_j = i$ = $\text{If}\; A_{j,j} = 0$ = $\text{return:}\; j$ = $A_{k,j} \leftarrow \frac{A_{k,j}}{A_{j,j}} \quad (j+1 \leq k < m)$ = $A_{k, l} \leftarrow A_{k, l} - A_{k,j} A_{j,l} \quad (j+1 \leq k,l < m)$ = $\text{return:}\; -1$ -------------------------------------------------------------------------------- Natürlich sollen dabei möglichst die auf der vorigen Seite entwickelten Bausteine verwendet werden. Als Signatur legen wir fest: ---- CODE (type=cc) ------------------------------------------------------------ #ifndef HPC_ULMLAPACK_GETF2_H #define HPC_ULMLAPACK_GETF2_H 1 namespace hpc { namespace ulmlapack { template Index getf2(Index m, Index n, TA *A, Index incRowA, Index incColA, TP *p, Index incP) { /* ... */ } } } // namespace ulmblas, hpc #endif // HPC_ULMLAPACK_GETF2_H -------------------------------------------------------------------------------- Zum Test kann folgendes Programm benutzt werden: :import: session17/hpc/tests/lu.cc :navigate: up -> doc:index back -> doc:session17/page01 next -> doc:session17/page03