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
Scarica

Lezione 12