Narzędzia użytkownika

Narzędzia witryny


reprezentacje_macierzy

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:

  1. błąd kompilacji - np.:
    • nie można modyfikować macierzy jednostkowej, zerowej, skalarnej - gdyż w momencie tworzenia są one inicjowane na stałe.
  2. 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.
  3. 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:

  1. 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
  2. Triangular Matrix - macierz trójkątna
  3. Symmetric Matrix - macierz symetryczna
  4. Hermitian Matrix - macierz Hermitowska
  5. Banded Matrix - macierz wstęgowa
  6. 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
    • row_major (domyslne) - wierszami
    • column_major - kolumnami
  • 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 dodatkowo id(i,i) = 1 - dolna jednostkowa macierz trójkątna (unit_lower)
  • jesli dla i>j: 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<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>
  • 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 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>
  • M - typ adaptowanej macierzy

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
  • 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<j-u to id(i,j)=0
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
  • odwzorowuje _niezerowe_ elementy id(i,j) na elementy kontenera typu podanego jako trzeci parametr (A) szablonu klasy.
Szablon klasy: mapped_matrix<T, F, A>
  • 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<std::size_t, T>
    • map_std<std::size_t, T>, czyli std::map<std::size_t, T>

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
    • unbounded_array<T> - domyslnie: unbounded_array<std::size_t>
    • bounded_array<T>
    • std::vector<T>

Kod źródłowy

Linki zewnętrzne

reprezentacje_macierzy.txt · ostatnio zmienione: 2009/04/28 21:07 przez zfabijan