====== 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.: * nie można modyfikować macierzy jednostkowej, zerowej, skalarnej - gdyż w momencie tworzenia są one inicjowane na stałe. - 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 - typ macierzy * F - organizacja zapisu * row_major (domyslne) - wierszami * column_major - kolumnami * A - typ tablicy zapisu: * unbounded_array (domyslne) - brak ograniczenia na rozmiar macierzy podawany przy definicji * bounded_array - alokacja macierzy na stercie, macierz moze miec <= N elementow; ALLOC - domyślnie std::allocator * std::vector 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 ij: id(i,j)=0 - gorna macierz trojkątna (upper) * jesli dodatkowo id(i,i) = 1 - gorna jednostkowa macierz trójkątna (unit_upper) == Szablon klasy: triangular_matrix == * F1 - typ macierzy: lower (domyślny), unit_lower, upper, unit_upper * F2 - organizacja zapisu, jak F w matrix === 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 - typ adaptowanej macierzy ==== 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 ij: id(i,j)=0 - górna macierz symetryczna (upper) == Szablon klasy: symetric_matrix == * F1 - typ macierzy: lower (domyslny), upper * F2 - organizacja zapisu, jak F w matrix === 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 - typ adaptowanej macierzy ==== Hermitian Matrix ==== Jest to rodzaj macierzy kwadratowej, jednak w klasie należy definiować rozmiar obydwu wymiarow. == Szablon klasy: hermitian_matrix == == Dla wymiarów macierzy NxN, 0 <= i < N,0 <= j < N == * id(i,j) = id'(j,i), gdzie id' = liczba sprzężona z id 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 == * jesli i>j+l lub i == ==== 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 == * odwzorowuje _niezerowe_ elementy id(i,j) na elementy kontenera typu podanego jako trzeci parametr (A) szablonu klasy. == Szablon klasy: mapped_matrix == * F - organizacja zapisu: * row_major (domyslne) - wierszami, id(i,j) -> (i*n+j)-ty element kontenera * column_major - kolumnami, id(i,j) -> (j*n+i)-ty element kontenera * A - typ kontenera zapisu: * map_array * map_std, czyli std::map === Compressed Matrix, Coordinate Matrix === Osobne kontenery dla indeksów elementu i wartości. == Szablon klasy: compressed_matrix == * IB - baza indeksu skompresowanego kontenera (domyślnie: 0) * IA - typ kontenera indeksow elementow macierzy * TA - typ kontenera wartosci elementow * unbounded_array - domyslnie: unbounded_array * bounded_array * std::vector ===== Kod źródłowy ===== [[http://staff.elka.pw.edu.pl/~rnowak2/zprwiki/lib/exe/fetch.php?id=biblioteki_boost&cache=cache&media=ublas_repr.cpp|ublas_repr.cpp]] ===== Linki zewnętrzne ===== [[http://www.boost.org/doc/libs/1_38_0/libs/numeric/ublas/doc/index.htm | Dokumentacja uBLAS]] --- //[[Z.Fabijanski@stud.elka.pw.edu.pl|Zbigniew Fabijański H1ISI]]//