Elementi di programmazione ad oggetti a. a. 2009/2010 Corso di Laurea Magistrale in Ingegneria Elettronica Docente: Mauro Mazzieri, Dipartimento di Ingegneria Informatica, Gestionale e dell’Automazione Lezione 12 Calcolo numerico Vettori numerici Vettore numerico ottimizzato per elaborazioni numeriche ad alte prestazioni Non è progettato per genericità o semplicità d’uso, ma per consentire tutte le ottimizzazioni possibili Le operazioni possono essere espanse in linea e sono prive di effetti collaterali Sono privi di alias Un valarray è un vettore nel senso matematico del termine valarray Un valarray può essere creato vuoto, con n elementi inizializzati ad un valore o ad un valore di default, per copia, o (caso comune) da un array valarray<int> vi; valarray<float> vf(1000); valarray<double> vb(0.5, 2000); valarray<double> vb2(vb); const double v[] = { 0, 2.4, 1, 3.5, 3 }; valarray<double> vb3(v); Operazioni su valarray Assegnamento Indicizzazione vb2 = vb1; vb1 = 1; // assegna 1 ad ogni elemento double b = vb2[3]; Funzioni membro *= ecc. sum() shift(), cshift() apply(T f(T), apply(T f(cost T&)) -, +, ~, ! min(), max() size() resize() è una reinizializzazione Operazioni su valarray Operatori non membro * ecc. abs ecc. slice Un taglio è costituito da ogni n-esimo elemento di un vettore, a partire da una posizione: class std::slice { // … public: slice(size_t start, size_t size, size_t stride); } Esempio: size_t slice_index(const slice&, size_t i) { return s.start() + i * s.stride(); } slice e matrici FORTRAN Uno slice può essere usato per simulare una matrice tramite un valarray In FORTRAN le matrici vengono memorizzate per colonna: 0 1 2 3 4 5 6 7 8 9 10 11 La riga i di una matrice nxm è slice(i, m, n) La colonna j di una matrice nxm è slice(j * n, n, 1) slice_array Uno slice_array è costruito da un array e uno slice elementi dell’array corrispondente agli indici dello slice Non viene istanziato direttamente, ma indicizzando un array tramite uno slice: valarray<double> d; // … slice_array<double>& d[slice(0, d.size() slice_array<double>& d[slice(1, d.size() even = / 2, 2)]; odd ) / 2, 2)]; gslice, mask_array, indirect_array Un taglio generalizzato (gslice) è definito da n passi e n dimensioni Una maschera (mask_array) si ottiene indicizzando un valarray con un valarray<bool> Un array indiretto (indirect_array) si ottiene indicizzado un valarray con un valarray<size_t> Algoritmi numerici L’header <numeric> definisce degli algoritmi numerici generalizzati sullo stile di <algorithm> accumulate() inner_product() partial_sum() adjacent_difference() Se non è sufficiente Implementazione storica ed usatissima delle comuni funzioni di calcolo numerico è BLAS (Basic Linear Algebra Subprograms), in FORTRAN Boost http://www.boost.org raccoglie diverse funzionalità “nello-stile-dellalibreria-standard-ma-che-non-sononella-libreria-standard” uBLAS fornisce template per vettori e matrici densi, sparsi, a blocchi