================ Funktionsobjekte ================ Es lohnt sich, die neue Fassung von `initGeMatrix` noch einmal genau anzusehen: ---- CODE (type=cpp) ---------------------------------------------------------- template void initGeMatrix(Index m, Index n, T *A, Index incRowA, Index incColA, InitValue initValue) { for (Index j=0; j void initGeMatrix(Index m, Index n, T *A, Index incRowA, Index incColA) { std::random_device random; std::mt19937 mt(random()); std::uniform_real_distribution uniform(-100, 100); for (Index j=0; j struct RandomValues { std::mt19937 mt; std::uniform_real_distribution uniform; RandomValues() : mt(std::random_device()()), uniform(-100, 100) { } T operator()(Index i, Index j, Index m, Index n) { return uniform(mt); } }; ------------------------------------------------------------------------------- So könnte dann eine Initialisierung aussehen: ---- CODE (type=cpp) ---------------------------------------------------------- initGeMatrix(A, RandomValues()); ------------------------------------------------------------------------------- Aufgaben ======== * Wenn das `RandomValues`-Objekt in diesem Beispiel erzeugt wird, lebt es dann auf dem Heap oder ist es ein globales, lokales oder temporäres Objekt? Was ist es nach der Parameterübergabe in `initGeMatrix`? Wie erfolgt die Parameterübergabe? * Wieso wurde oben `std::random_device()()` verwendet? Wieso hat das Konstrukt zwei Klammernpaare? Woran scheitert folgende naheliegende Fassung? ---- CODE (type=cpp) ------------------------------------------------------- template struct RandomValues { std::random_device random; std::mt19937 mt; std::uniform_real_distribution uniform; RandomValues() : mt(random()), uniform(-100, 100) { } T operator()(Index i, Index j, Index m, Index n) { return uniform(mt); } }; ---------------------------------------------------------------------------- * Im Grunde genommen benötigt der Funktionsoperator nur noch die Parameter `i` und `j`. Auf `m` und `n` kann verzichtet werden, da diese Parameter, wenn sie denn benötigt werden, als Komponenten in der Klasse untergebracht werden können. Vereinfachen Sie die entsprechenden Schnittstellen. * Ergänzen Sie `RandomValues` um einen Konstruktor mit einem Seed-Wert, der eine reproduzierbare Zahlenfolge ermöglicht. * Schreiben Sie eine Klasse `IncreasingRandomValues` analog zu `RandomValues`, bei der die konsekutiv abgerufenen einzelnen Werte streng monoton steigen, ansonsten aber wie gehabt pseudo-zufällig bestimmt werden. :navigate: up -> doc:index back -> doc:session11/page02 next -> doc:session11/page04