Narzędzia użytkownika

Narzędzia witryny


reprezentacje_macierzy

Różnice

Różnice między wybraną wersją a wersją aktualną.

Odnośnik do tego porównania

Both sides previous revision Previous revision
Next revision
Previous revision
reprezentacje_macierzy [2009/04/28 19:34]
zfabijan
reprezentacje_macierzy [2009/04/28 21:07] (aktualna)
zfabijan
Linia 3: Linia 3:
 ===== Wstęp ===== ===== 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. Rozne reprezentacje macierzy ​sluza przestrzeganiu zasad danego typu macierzy oraz zoptymalizowanemu przechowywaniu (np. macierzy rzadkich - w formie upakowanej).+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 rozny sposob na proby modyfikacji niezgodnej z cecha danego typu macierzy: +Biblioteka uBLAS reaguje w różny ​sposob na próby ​modyfikacji niezgodnej z cecha danego typu macierzy: 
-blad kompilacji - np.: +  błąd ​kompilacji - np.: 
-* nie mozna modyfikowac ​macierzy jednostkowej,​ zerowej, skalarnej - gdyz w momencie tworzenia ​sa one inicjowane na stale+    * nie można modyfikować ​macierzy jednostkowej,​ zerowej, skalarnej - gdyż w momencie tworzenia ​są one inicjowane na stałe
-blad wykonania - np.: +  błąd ​wykonania - np.: 
-* nie mozna modyfikowac ​elementu nad glowna przekatna ​dolnej macierzy ​trojkatnej, ale pozostale ​elementy ​mozna +    * nie można modyfikować ​elementu nad głowną przekatną ​dolnej macierzy ​trójkątnej, ale pozostałe ​elementy ​można 
-* nie mozna przypisac wartosci ​elementowi macierzy ​wstegowej, nie nalezacemu ​do glownej przekatnej ​lub jednej z jego wstegokreslonych ​przy definicji danego obiektu klasy. +    * nie można przypisać wartości ​elementowi macierzy ​wstęgowej, nie należącemu ​do głównej przekątnej ​lub jednej z jego wstęgokreślonych ​przy definicji danego obiektu klasy. 
-- brak sygnalizacji ​niezgodnosci ​- np.: +  - 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) +    * 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 glownej przekatnej ​macierzy hermitowskiej wartosci zespolone o niezerowej ​czesci ​urojonej - mimo, ze definicja macierzy Hermitowskiej nakazuje ​wartosci ​rzeczywiste na glownej przekatnej.+    * 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 ===== ===== Typy =====
  
-==== Matrix - podstawowy kontener dla macierzy ​gestych ===+Biblioteka uBLAS udostępnia następujące typy macierzy: 
-Szablon klasy: matrix<​T,​ F, A> +  - Matrix - podstawowy kontener dla macierzy ​gęstych 
- typ macierzy +    * Identity Matrix - macierz jednostkowa. Jest macierzą kwadratową (wymiary M=N). 
- organizacja zapisu +    * Zero Matrix - macierz zerowa 
- row_major (domyslne) ​wierszami +    * Scalar Matrix ​macierz skalarna ​ 
- column_major ​kolumnami +  Triangular Matrix - macierz trójkątna 
- typ tablicy zapisu: +  Symmetric Matrix - macierz symetryczna 
- unbounded_array<​T>​ (domyslne) ​brak ograniczenia na rozmiar macierzy podawany przy definicji +  Hermitian Matrix - macierz Hermitowska 
- bounded_array<​T,​ N, ALLOC> ​alokacja macierzy na stercie, ​macierz ​moze miec <= N elementow; ​ +  Banded Matrix - macierz wstęgowa 
-ALLOC domyslnie std::​allocator +  Sparse Matrix - macierz rzadka 
- std::​vector<​T>​+    * Mapped Matrix ​- macierz ​odwzorowania 
 +    * Compressed Matrix ​macierz skompresowana 
 +    * Coordinate Matrix - macierz koordynacji
  
  
-Inne typy macierzy ​gestych ​typy stalenie mozna modyfikowac ​elementow. +==== Matrix ==== 
-Tak jak klasa matrix<>, inne klasy rowniez obsluguja rozszerzona deklaracje z kilkoma parametrami szablonu klasy.+== 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<​TN, 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 ​- macierz jednostkowa. Jest macierza kwadratowa (wymiary M=N). === +=== Identity Matrix === 
-Dla wymiarow ​macierzy NxN, 0 <= i < N, 0 <= j < N +== 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,j) = 0 
- id(i,i) = 1.+  * 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.
  
-=== Zero Matrix ​- macierz zerowa ​=== +=== Scalar ​Matrix === 
-Wszystkie elementy = 0. +Każdy element macierzy to stała wartość, podana w konstruktorze (domyslnie ​0)
-Proba modyfikacji dowolnej ​wartosci ​macierzy w kodzie ​konczy sie bledem ​kompilacji.+Próba ​modyfikacji dowolnej ​wartości ​macierzy w kodzie ​kończy się błędem ​kompilacji.
  
  
-=== Scalar ​Matrix ​- macierz skalarna ​=== +==== Triangular ​Matrix ​==== 
-Kazdy element ​macierzy ​= stala wartoscpodana ​konstruktorze ​(domyslnie: 0); +Jest to rodzaj ​macierzy ​kwadratowejjednak ​klasie należy definiować rozmiar obydwu wymiarow. 
-Proba modyfikacji dowolnej wartosci macierzy w kodzie konczy sie bledem kompilacji.+== 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>jid(i,j)=- 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 ​Matrix ​macierz trojkatna ==== +=== Triangular ​Adaptor ​adapter dla macierzy innych typów ​=== 
-Jest to rodzaj ​macierzy ​kwadratowej,​ jednak ​klasie nalezy definiowac rozmiar obu wymiarow+Zmiana wartości w macierzy ​adaptowanej jest odzwierciedlona ​obiekcie klasy adaptera
-Dla wymiarow ​macierzy ​NxN, 0 <= i < N,0 <= j < N +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. 
- jesli dla i<j: id(i,j)=0 - dolna macierz trojkatna (lower) +== Szablon klasy: ​triangular_adaptor<MF== 
- jesli dodatkowo id(i,i) = 1 - dolna jednostkowa macierz trojkatna (unit_lower) +  * M - typ adaptowanej ​macierzy
- jesli dla i>j: id(i,j)=0 - gorna macierz trojkatna (upper) +
- jesli dodatkowo id(i,​i) ​1 - gorna jednostkowa macierz trojkatna (unit_upper) +
-Szablon klasy: ​triangular_matrix<TF1, F2, A+
- F1 - typ macierzy: lower (domyslny), unit_lower, upper, unit_upper +
- F2 - organizacja zapisu, jak F w matrix<​T,​ F, A>+
  
  
-=== Triangular Adaptor - adapter dla macierzy innych typow === +==== Symmetric Matrix ==== 
-Zmiana wartosci w macierzy ​adaptowanej jest odzwierciedlona ​obiektcie klasy adaptera+Jest to rodzaj ​macierzy ​kwadratowej,​ jednak ​klasie należy definiować rozmiar obydwu wymiarów
-Tu takze proba zmiany wartosci na glownej przekatnej dla typu macierzy ​unit_lower lub unit_upper konczy sie wyjatkiem. +== Dla wymiarów ​macierzy ​NxN, 0 <= i < N,0 <= j < N == 
-Szablon klasy: ​triangular_adaptor<MF+  * id(i,​j)=id(j,​i) 
- - typ adaptowanej ​macierzy+    * 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<TF1, 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
  
-==== Symmetric Matrix - macierz symetryczna. ==== 
-Jest to rodzaj macierzy kwadratowej,​ jednak w klasie nalezy definiowac rozmiar obu wymiarow. 
-Dla wymiarow macierzy NxN, 0 <= i < N,0 <= j < N 
- id(i,​j)=id(j,​i) 
- jesli dodatkowo dla i<j: id(i,j)=0 - dolna macierz symetryczna (lower) 
- jesli dodatkowo dla i>j: id(i,j)=0 - gorna 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> 
  
 +==== 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.
  
-=== Symmetric Adaptor - adapter dla macierzy innych typow. === 
-Zmiana wartosci w macierzy adaptowanej jest odzwierciedlona w obiektcie klasy adaptera. 
-Szablon klasy: symmetric_adaptor<​M,​ F> 
- M - typ adaptowanej macierzy 
  
 +==== 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> ==
  
-==== Hermitian Matrix - macierz Hermitowska ==== 
-Jest to rodzaj macierzy kwadratowej,​ jednak w klasie nalezy definiowac rozmiar obu wymiarow. 
-Szablon klasy: hermitian_matrix<​T,​ F1, F2, A> 
-Dla wymiarow macierzy NxN, 0 <= i < N,0 <= j < N 
- id(i,j) = id'​(j,​i),​ gdzie id' = liczba sprzezona z id 
-Implementacja macierzy Hermitowskiej w uBLAS dopuszcza umieszszczenie na glownej przekatnej macierzy 
-wartosci zespolonych o niezerowej czesci urojonej mimo, ze nie jest to macierz Hermitowska. 
  
 +==== Sparse Matrix ====
 +Poniższe klasy macierzy rzadkich różnią się tylko sposobem przechowywania macierzy.
  
-==== Banded ​Matrix ​- macierz wstegowa ==== +=== Mapped ​Matrix === 
-Wszystkie elementy macierzy wstegowej sa zerowe poza glowna przekatna i okreslonymi przekatnymi ​(wstegami). +Kontenerem jest mapa (indeks elementu, wartość). 
-Dla wymiarow ​macierzy MxN, 0 <= i < M,0 <= j < N, l-liczba niezerowych dolnych przekatnych ​(tych pod przekatna glowna), u-liczba gornych przekatnych. +== Dla wymiarów ​macierzy MxN, 0 <= i < M,0 <= j < N == 
- Dla i>j+l lub i<j-u: id(i,j)=0 +  * odwzorowuje _niezerowe_ elementy id(i,j) na elementy kontenera typu podanego jako trzeci parametr ​(Aszablonu klasy. 
-Szablon klasybanded_matrix<​T, ​FA>+== Szablon klasy: mapped_matrix<​TF, 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_tT>czyli std::​map<​std::​size_t,​ T>
  
- +=== Compressed Matrix, Coordinate Matrix === 
-==== Sparse Matrix - macierz rzadka. ==== +Osobne kontenery dla indeksów ​elementu i wartości
-Ponizsze klasy macierzy rzadkich roznia sie tylko sposobem przechowywania macierzy. +== Szablon klasy: compressed_matrix<​T,​ F, IB, IA, TA> ​== 
- +  ​* ​IB - baza indeksu skompresowanego kontenera (domyślnie: 0) 
-=== Mapped Matrix - macierz odwzorowania. === +  ​* ​IA - typ kontenera indeksow elementow macierzy 
-Kontenerem jest mapa (indeks elementu, wartosc) +  ​* ​TA - typ kontenera wartosci elementow 
-Dla wymiarow macierzy MxN, 0 <= i < M,0 <= j < N +    ​* ​unbounded_array<​T>​ - domyslnie: unbounded_array<​std::​size_t>​ 
- odwzorowuje _niezerowe_ elementy id(i,j) na elementy kontenera typu podanego jako trzeci parametr (A) szablonu klasy. +    ​* ​bounded_array<​T>​ 
-Szablon klasy: mapped_matrix<​T,​ F, A> +    ​* ​std::​vector<​T>​
- 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 ​- macierz skompresowana, Coordinate Matrix ​- macierz koordynacji ​=== +
-Osobne kontenery dla indeksow ​elementu i wartosci+
-Szablon klasy: compressed_matrix<​T,​ F, IB, IA, TA> +
- IB - baza indeksu skompresowanego kontenera (domyslnie: 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 ===== ===== Kod źródłowy =====
-Poniższy kod prezentuje zastosowanie przykładowych klas biblioteki uBLAS. 
- 
-<code cpp> 
-// Zbigniew Fabijanski, H1ISIII 
-// ZPR - praca domowa - Zad.27 - Biblioteki boost - boost::​uBLAS (reprezentacje macierzy). 
- 
-#include <​boost/​numeric/​ublas/​matrix.hpp>​ // Macierz gesta. 
-#include <​boost/​numeric/​ublas/​triangular.hpp>​ // Macierz trojkatna. 
-#include <​boost/​numeric/​ublas/​symmetric.hpp>​ // Macierz symetryczna. 
-#include <​boost/​numeric/​ublas/​hermitian.hpp>​ // Macierz Hermitowska 
-#include <​boost/​numeric/​ublas/​banded.hpp>​ // Macierz wstegowa. 
-#include <​boost/​numeric/​ublas/​matrix_sparse.hpp>​ // Macierze rzadkie. 
- 
-#include <​boost/​numeric/​ublas/​io.hpp>​ // Operatory << i >> dla klas macierzy. 
- 
- 
-int main () { 
- // import przestrzeni nazw 
- using namespace boost::​numeric::​ublas;​ 
- using std::cout; 
- using std::endl; 
- 
- // --------------------------------------- Matrix --------------------------------------- 
- { 
- // Definicja macierzy gestej o 2 wierszach i 3 kolumnach. 
- matrix<​double>​ m (2, 3); // Typ rownowazny: matrix<​double,​ row_major, unbounded_array<​double>​ > 
- try { 
- std::​cout << "Proba deklaracji macierzy 3x3 zapisane w kontenerze o rozmiarze 8: " << std::endl; 
- 
- // Nieprawidlowa definicja klasy z wieksza liczba elementow (3*3=9), niz okreslono w typie kontenera przechowujacego zawartosci macierzy (8). 
- // matrix<​double,​ row_major, bounded_array<​double,​ 8> > mb (3, 3); 
- // Taki rodzaj deklaracji jest rowniez dostepny dla wszystkich innych klas macierzy. 
- matrix<​double,​ row_major, bounded_array<​double,​ 8> > mb (3, 3); // Ta definicja wygeneruje wyjatek blednego rozmiaru przydzielonej na zawartosc macierzy sterty. 
- } 
- catch (std::​exception &e){ 
- std::​cout << "​Exception:​ " << e.what() << std::endl; 
- } 
- 
- // Przypisanie do macierzy wartosci kolejny liczb naturalnych - wierszami. 
- for (unsigned i = 0; i < m.size1 (); ++ i) // dla kazdego wiersza macierzy 
- for (unsigned j = 0; j < m.size2 (); ++ j) // dla kazdej kolumny macierzy 
- m (i, j) = 3 * i + j; 
- 
- // Wyswietlenie zawartosci macierzy - przeciazony operator<<​ dla klas macierzy. 
- std::cout << "​Macierz gesta:"​ << std::endl << m << std::endl; 
- } 
- 
- // Macierz jednostkowa 
- { 
- // W definicji nastepuje automatyczne inicjowanie _stalych_ wartosci macierzy. 
- identity_matrix<​double>​ m (3); // Podajemy jedyny wymiar macierzy, poniewaz macierz jednostkowa jest z definicji kwadratowa (M=N). 
- std::cout << "​Macierz jednostkowa:" ​ << std::endl << m << std::endl; 
- 
- // Odkomentowanie ponizszej linijki skutkuje bledem kompilacji, bez wzgledu na to, czy naruszymy reguly wartosci elementow macierzy jednostkowej,​ czy nie. 
- // m(0,0) = 1; 
- } 
- 
- // Macierz zerowa 
- { 
- // Tu rowniez inicjalizacja wszystkich elementow - na wartosci zerowe. 
- zero_matrix<​double>​ m (3,4); // Mozliwy takze konstruktor z 1 argumentem - macierz kwadratowa. 
- std::cout << "​Macierz zerowa:" ​ << std::endl << m << std::endl; 
- } 
- 
- // Macierz skalarna 
- { 
- scalar_matrix<​double>​ m(3,3,4); // Macierz o wymiarach 3x3, wypelniona wartosciami 4. 
- std::cout << "​Macierz skalarna:" ​ << std::endl << m << std::endl; 
- } 
- 
- 
- // --------------------------------------- Triangular Matrix --------------------------------------- 
- { 
- // Wypelnienie kolejnymi liczbami tylko dolnej czesci macierzy i glownej przekatnej, gdyz jest to macierz dolna, 
- // a wiec elementy nad glowna przekatna maja wartosci 0 przypisane na stale w definicji. 
- triangular_matrix<​double,​ lower> tml (3, 4); 
- for (unsigned i = 0; i < tml.size1 (); ++ i) // dla kazdego wiersza macierzy 
- for (unsigned j = 0; j <= i; ++ j) // dla kazdej kolumny macierzy, ale dla elementow pod glowna przekatna 
- tml (i, j) = 3 * i + j; 
- std::cout << "Dolna macierz trojkatna:"​ << std::endl << tml << std::endl; 
- 
- // Definicja gornej jednostkowej macierzy trojkatnej. 
- triangular_matrix<​double,​ unit_upper>​ tmup (3, 3); 
- // Wypelnienie liczbami tylko elementow nad glowna przekatna macierzy. 
- for (unsigned i = 0; i < tmup.size1 (); ++ i) // dla kazdego wiersza macierzy 
- // Wartosci na glownej przekatnej zostaly juz zainicjowane przy definicji macierzy, 
- // dlatego petla wewnetrzna od j=i+1, a nie j=i. 
- for (unsigned j = i+1; j < tmup.size2 (); ++ j) // dla kazdej kolumny macierzy, ale dla elementow nad glowna przekatna 
- tmup (i, j) = 3 * i + j; 
- 
- std::cout << "Gorna jednostkowa macierz trojkatna:"​ << std::endl << tmup << std::endl; 
- 
- // Proba zmiany wartosci na glownej przekatnej macierzy jednostkowej. 
- try { 
- std::​cout << "Proba zmiany wartosci na glownej przekatnej gornej jednostkowej macierzy trojkatnej:"​ << std::endl; 
- tmup(0,​0)=-1;​ // Ta linijka rzuci wyjatek, poniewaz w gornej _jednostkowej_ macierzy trojkatnej 
- // mozemy zmieniac tylko wartosci pod glowna przekatna. 
- } 
- catch (std::​exception &e){ 
- std::​cout << "​Exception:​ " << e.what() << std::endl; 
- } 
- 
- } 
- // Triangular Adaptor 
- { 
- // Definicja macierzy gestej - adaptowanej. 
- matrix<​double>​ m(3,3); 
- for (unsigned i = 0; i < m.size1 (); ++ i) // dla kazdego wiersza macierzy 
- for (unsigned j = 0; j < m.size2 (); ++ j) // dla kazdej kolumny macierzy 
- m (i, j) = 3 * i + j + 1; // Przypisanie macierzy adaptowanej kolejnych liczb naturalnych. 
- 
- // Definicja dolnego adaptera macierzy gestej. 
- triangular_adaptor<​matrix<​double>,​ lower> tal (m); 
- std::cout << "Dolny adapter trojkatny macierzy : " << m << " to: " << std::endl; 
- std::cout << tal << std::endl; // Elementy nad glowna przekatna maja wartosc 0. 
- } 
- 
- // --------------------------------------- Symmetric Matrix --------------------------------------- 
- { 
- // Dolna macierz symetryczna. Wartosci nad glowna przekatna wskazuja na odpowiednie wartosci symetrycznych pod przekatna. 
- symmetric_matrix<​double,​ lower> sml (3, 3); 
- // Wystarczy przypisac wartosci czesci macierzy po jednej stronie glownej przekatnej, 
- // gdyz elementy po drugiej stronie wskazuja na swoich symetrycznych odpowiednikow. 
- for (unsigned i = 0; i < sml.size1 (); ++ i) // dla kazdego wiersza macierzy 
- for (unsigned j = 0; j < /​*i*/​sml.size2 (); ++ j) // dla kazdej kolumny macierzy, ten sam efekt, co dla petli z warunkiem j <= i 
- sml(i, j) = 3 * i + j + 1; 
- // Modyfikacja wartosci id(i,j) powoduje modyfikacje takze id(j,i). 
- sml(1, 0)=-1; // Ten sam efekt, co instrukcja sml(0,​1)=-1;​ 
- std::cout << "Dolna macierz symetryczna:​ " << std::endl << sml << std::endl; 
- } 
- // Symmetric Adaptor 
- { 
- // Macierz adaptowana. 
- matrix<​double>​ m(3,3); 
- for (unsigned i = 0; i < m.size1 (); ++ i) // dla kazdego wiersza macierzy 
- for (unsigned j = 0; j < m.size2 (); ++ j) // dla kazdej kolumny macierzy 
- m (i, j) = 3 * i + j + 1; 
- 
- // Poniewaz adaptowanie przebiega w porzadku wierszowym, a nie kolumnowym, 
- //​ wartosci po gornej stronie glownej przekatnej wskazuja symetryczne wartosci spod glownej przekatnej, a nie odwrotnie. 
- symmetric_adaptor<​matrix<​double>​ > sa (m); // Brak 2.argumentu klasy szablonu => wartosc domyslna (lower) 
- 
- // Dopiero tutaj widac roznice pomiedzy dolna a gorna macierza symetryczna. 
- // Instrukcja zmiany wartosci adaptera zmienia oba symetryczne elementy obiektu adaptera macierzy. 
- // Ale poniewaz jest to gorny adapter macierzy, w macierzy adaptowanej zmienia sie tylko element nad glowna przekatna macierzy. 
- sa(1,​0)=-1;​ // A dla macierzy adaptowanej m - ten sam efekt, co instrukcja sa(0,1)=-1; 
- std::cout << "Dolny adapter symetryczny stworzonej z macierzy gestej: " << m << " to: " << std::endl; 
- std::cout << sa << std::endl; 
- } 
- // --------------------------------------- Hermitian Matrix --------------------------------------- 
- { 
- // Deklaracja dolnej macierzy Hermitowskiej. 
- hermitian_matrix<​std::​complex<​double>,​ lower> hml (3, 3); 
- for (unsigned i = 0; i < hml.size1 (); ++ i) { // dla kazdego wiersza macierzy 
- for (unsigned j = 0; j < i; ++ j) // dla kazdej kolumny macierzy 
- hml (i, j) = std::​complex<​double>​ (3 * i + j, 3 * i + j); // Wypelniamy macierzy liczbami zespolonymi (complex) 
- hml (i, i) = std::​complex<​double>​ (4 * i, 0); // wartosci na glownej przekatnej 
- } 
- std::cout << "Dolna macierz Hermitowska:"​ << std::endl << hml << std::endl; 
- } 
- // Hermitian Adaptor - analogicznie do innych adapterow. 
- 
- // --------------------------------------- Banded Matrix --------------------------------------- 
- { 
- signed l=1, u=1; // l,u - ilosc niezerowych przekatnych pod,nad przekatna glowna 
- banded_matrix<​double>​ bm (3, 3, l, u); // l=1, u=1 
- // Dla wszystkich wierszy. 
- for (signed i = 0; i < signed (bm.size1 ()); ++ i) // dla kazdego wiersza macierzy 
- // Dla kolumn, ktorych indeks nalezy do przedzialu [-l,u) wzgledem 
- for (signed j = std::max (i - l, 0); j < std::min (i + u, signed (bm.size2 ())); ++ j) 
- bm (i, j) = 3 * i + j + 1; 
- std::cout << "​Macierz wstegowa:"​ << std::endl << bm << std::endl; 
- //​ bm(2,​0)=0;​ // ta instrukcja generuje wyjatek 
- } 
- // Banded Adaptor - analogicznie do innych adapterow. 
-} 
  
-</code>+[[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 ===== ===== Linki zewnętrzne =====
  
-[[http://​www.boost.org/​doc/​libs/​1_38_0/​libs/​numeric/​ublas/​doc/​index.htm | Strona domowa ​uBLAS]]+[[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]] ​2009/04/28 19:31//+ --- //​[[Z.Fabijanski@stud.elka.pw.edu.pl|Zbigniew Fabijański H1ISI]]//
  
reprezentacje_macierzy.1240940099.txt.gz · ostatnio zmienione: 2009/04/28 19:34 przez zfabijan