Biblioteka Boost.uBLAS
Wstęp
uBLAS (Basic Linear Algebra Subprograms) – biblioteka klas szablonowych, dostarczająca struktur do reprezentacji wektorów i macierzy różnego typu (np. macierz trójkątna, symetryczna, rzadka) oraz operacji na nich. Różne reprezentacje macierzy służą przestrzeganiu zasad danego typu macierzy oraz zoptymalizowanemu przechowywaniu (np. macierzy rzadkich - w formie upakowanej).
Biblioteka uBLAS reaguje w różny sposob na próby modyfikacji niezgodnej z cecha danego typu macierzy:
błąd kompilacji - np.:
błąd wykonania - np.:
nie można modyfikować elementu nad głowną przekatną dolnej macierzy trójkątnej, ale pozostałe elementy można
nie można przypisać wartości elementowi macierzy wstęgowej, nie należącemu do głównej przekątnej lub jednej z jego wstęg, określonych przy definicji danego obiektu klasy.
brak sygnalizacji niezgodności - np.:
możliwość definicji macierzy o innej liczbie wierszy, niż kolumn, dla macierzy, które z definicji powinny być kwadratowe (np. macierz jednostkowa, trójkątna)
mozna przypisac elementom na głównej przekątnej macierzy hermitowskiej wartosci zespolone o niezerowej części urojonej - mimo, ze definicja macierzy Hermitowskiej nakazuje
wartości rzeczywiste na głównej przekątnej.
Typy
Biblioteka uBLAS udostępnia następujące typy macierzy:
Matrix - podstawowy kontener dla macierzy gęstych
Identity Matrix - macierz jednostkowa. Jest macierzą kwadratową (wymiary M=N).
Zero Matrix - macierz zerowa
Scalar Matrix - macierz skalarna
Triangular Matrix - macierz trójkątna
Symmetric Matrix - macierz symetryczna
Hermitian Matrix - macierz Hermitowska
Banded Matrix - macierz wstęgowa
Sparse Matrix - macierz rzadka
Mapped Matrix - macierz odwzorowania
Compressed Matrix - macierz skompresowana
Coordinate Matrix - macierz koordynacji
Matrix
Szablon klasy: matrix<T, F, A>
T - typ macierzy
F - organizacja zapisu
A - typ tablicy zapisu:
unbounded_array<T> (domyslne) - brak ograniczenia na rozmiar macierzy podawany przy definicji
bounded_array<T, N, ALLOC> - alokacja macierzy na stercie, macierz moze miec ⇐ N elementow; ALLOC - domyślnie std::allocator
std::vector<T>
Inne typy macierzy gęstych - typy stałe, nie można modyfikowac ich elementow.
Tak jak klasa matrix<>, inne klasy również obsługują rozszerzoną deklarację z kilkoma parametrami szablonu klasy.
Identity Matrix
Dla wymiarów macierzy NxN, 0 <= i < N, 0 <= j < N
jesli i <> j to id(i,j) = 0
jesli i=j to id(i,i) = 1.
Zero Matrix
Wszystkie elementy mają wartosc 0.
Próba modyfikacji dowolnej wartości macierzy w kodzie kończy sie błędem kompilacji.
Scalar Matrix
Każdy element macierzy to stała wartość, podana w konstruktorze (domyslnie 0).
Próba modyfikacji dowolnej wartości macierzy w kodzie kończy się błędem kompilacji.
Triangular Matrix
Jest to rodzaj macierzy kwadratowej, jednak w klasie należy definiować rozmiar obydwu wymiarow.
Dla wymiarów macierzy NxN, 0 <= i < N,0 <= j < N
jesli dla i<j: id(i,j)=0 - dolna macierz trójkątna (lower)
jesli dla i>j: id(i,j)=0 - gorna macierz trojkątna (upper)
Szablon klasy: triangular_matrix<T, F1, F2, A>
F1 - typ macierzy: lower (domyślny), unit_lower, upper, unit_upper
F2 - organizacja zapisu, jak F w matrix<T, F, A>
Triangular Adaptor - adapter dla macierzy innych typów
Zmiana wartości w macierzy adaptowanej jest odzwierciedlona w obiekcie klasy adaptera.
Tu także próba zmiany wartości na głównej przekątnej dla typu macierzy unit_lower lub unit_upper kończy się wyjątkiem.
Szablon klasy: triangular_adaptor<M, F>
Symmetric Matrix
Jest to rodzaj macierzy kwadratowej, jednak w klasie należy definiować rozmiar obydwu wymiarów.
Dla wymiarów macierzy NxN, 0 <= i < N,0 <= j < N
id(i,j)=id(j,i)
jeśli dodatkowo dla i<j: id(i,j)=0 - dolna macierz symetryczna (lower)
jeśli dodatkowo dla i>j: id(i,j)=0 - górna macierz symetryczna (upper)
Szablon klasy: symetric_matrix<T, F1, F2, A>
F1 - typ macierzy: lower (domyslny), upper
F2 - organizacja zapisu, jak F w matrix<T, F, A>
Symmetric Adaptor - adapter dla macierzy innych typów
Zmiana wartości w macierzy adaptowanej jest odzwierciedlona w obiektcie klasy adaptera.
Szablon klasy: symmetric_adaptor<M, F>
Hermitian Matrix
Jest to rodzaj macierzy kwadratowej, jednak w klasie należy definiować rozmiar obydwu wymiarow.
Szablon klasy: hermitian_matrix<T, F1, F2, A>
Dla wymiarów macierzy NxN, 0 <= i < N,0 <= j < N
Implementacja macierzy Hermitowskiej w uBLAS dopuszcza umieszszczenie na głównej przekątnej macierzy
wartości zespolonych o niezerowej cześci urojonej mimo, ze nie jest to macierz Hermitowska.
Banded Matrix
Wszystkie elementy macierzy wstęgowej są zerowe poza główna przekątną i określonymi przekątnymi (wstęgami).
Dla wymiarów macierzy MxN, 0 <= i < M,0 <= j < N, l-liczba niezerowych dolnych przekątnych (tych pod przekątna główną), u-liczba górnych przekątnych
Szablon klasy: banded_matrix<T, F, A>
Sparse Matrix
Poniższe klasy macierzy rzadkich różnią się tylko sposobem przechowywania macierzy.
Mapped Matrix
Kontenerem jest mapa (indeks elementu, wartość).
Dla wymiarów macierzy MxN, 0 <= i < M,0 <= j < N
Szablon klasy: mapped_matrix<T, F, A>
Compressed Matrix, Coordinate Matrix
Osobne kontenery dla indeksów elementu i wartości.
Szablon klasy: compressed_matrix<T, F, IB, IA, TA>
IB - baza indeksu skompresowanego kontenera (domyślnie: 0)
IA - typ kontenera indeksow elementow macierzy
TA - typ kontenera wartosci elementow
Kod źródłowy
Linki zewnętrzne