Różnice między wybraną wersją a wersją aktualną.
Both sides previous revision Previous revision Next revision | Previous revision Next revision Both sides next revision | ||
reprezentacje_macierzy [2009/04/28 20:31] zfabijan |
reprezentacje_macierzy [2009/04/28 21:04] zfabijan |
||
---|---|---|---|
Linia 151: | Linia 151: | ||
<code cpp> | <code cpp> | ||
// Zbigniew Fabijanski, H1ISIII | // Zbigniew Fabijanski, H1ISIII | ||
+ | |||
// ZPR - praca domowa - Zad.27 - Biblioteki boost - boost::uBLAS (reprezentacje macierzy). | // ZPR - praca domowa - Zad.27 - Biblioteki boost - boost::uBLAS (reprezentacje macierzy). | ||
+ | |||
+ | |||
#include <boost/numeric/ublas/matrix.hpp> // Macierz gesta. | #include <boost/numeric/ublas/matrix.hpp> // Macierz gesta. | ||
+ | |||
#include <boost/numeric/ublas/triangular.hpp> // Macierz trojkatna. | #include <boost/numeric/ublas/triangular.hpp> // Macierz trojkatna. | ||
+ | |||
#include <boost/numeric/ublas/symmetric.hpp> // Macierz symetryczna. | #include <boost/numeric/ublas/symmetric.hpp> // Macierz symetryczna. | ||
+ | |||
#include <boost/numeric/ublas/hermitian.hpp> // Macierz Hermitowska | #include <boost/numeric/ublas/hermitian.hpp> // Macierz Hermitowska | ||
+ | |||
#include <boost/numeric/ublas/banded.hpp> // Macierz wstegowa. | #include <boost/numeric/ublas/banded.hpp> // Macierz wstegowa. | ||
+ | |||
#include <boost/numeric/ublas/matrix_sparse.hpp> // Macierze rzadkie. | #include <boost/numeric/ublas/matrix_sparse.hpp> // Macierze rzadkie. | ||
+ | |||
+ | |||
#include <boost/numeric/ublas/io.hpp> // Operatory << i >> dla klas macierzy. | #include <boost/numeric/ublas/io.hpp> // Operatory << i >> dla klas macierzy. | ||
+ | |||
+ | |||
+ | |||
int main () { | int main () { | ||
+ | |||
// import przestrzeni nazw | // import przestrzeni nazw | ||
+ | |||
using namespace boost::numeric::ublas; | using namespace boost::numeric::ublas; | ||
- | using std::cout; | + | |
- | using std::endl; | + | using cout; |
+ | |||
+ | using endl; | ||
+ | |||
// --------------------------------------- Matrix --------------------------------------- | // --------------------------------------- Matrix --------------------------------------- | ||
+ | |||
{ | { | ||
+ | |||
// Definicja macierzy gestej o 2 wierszach i 3 kolumnach. | // Definicja macierzy gestej o 2 wierszach i 3 kolumnach. | ||
+ | |||
matrix<double> m (2, 3); // Typ rownowazny: matrix<double, row_major, unbounded_array<double> > | matrix<double> m (2, 3); // Typ rownowazny: matrix<double, row_major, unbounded_array<double> > | ||
+ | |||
try { | try { | ||
- | std::cout << "Proba deklaracji macierzy 3x3 zapisane w kontenerze o rozmiarze 8: " << std::endl; | + | |
+ | cout << "Proba deklaracji macierzy 3x3 zapisane w kontenerze o rozmiarze 8: " << endl; | ||
+ | |||
// Nieprawidlowa definicja klasy z wieksza liczba elementow (3*3=9), niz okreslono w typie kontenera przechowujacego zawartosci macierzy (8). | // 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); | // matrix<double, row_major, bounded_array<double, 8> > mb (3, 3); | ||
+ | |||
// Taki rodzaj deklaracji jest rowniez dostepny dla wszystkich innych klas macierzy. | // 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. | + | 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){ | catch (std::exception &e){ | ||
- | std::cout << "Exception: " << e.what() << std::endl; | + | |
+ | cout << "Exception: " << e.what() << endl; | ||
} | } | ||
+ | |||
+ | |||
// Przypisanie do macierzy wartosci kolejny liczb naturalnych - wierszami. | // Przypisanie do macierzy wartosci kolejny liczb naturalnych - wierszami. | ||
+ | |||
for (unsigned i = 0; i < m.size1 (); ++ i) // dla kazdego wiersza macierzy | for (unsigned i = 0; i < m.size1 (); ++ i) // dla kazdego wiersza macierzy | ||
+ | |||
for (unsigned j = 0; j < m.size2 (); ++ j) // dla kazdej kolumny macierzy | for (unsigned j = 0; j < m.size2 (); ++ j) // dla kazdej kolumny macierzy | ||
+ | |||
m (i, j) = 3 * i + j; | m (i, j) = 3 * i + j; | ||
+ | |||
+ | |||
// Wyswietlenie zawartosci macierzy - przeciazony operator<< dla klas macierzy. | // Wyswietlenie zawartosci macierzy - przeciazony operator<< dla klas macierzy. | ||
- | std::cout << "Macierz gesta:" << std::endl << m << std::endl; | + | |
+ | cout << "Macierz gesta:" << endl << m << endl; | ||
} | } | ||
+ | |||
+ | |||
// Macierz jednostkowa | // Macierz jednostkowa | ||
+ | |||
{ | { | ||
+ | |||
// W definicji nastepuje automatyczne inicjowanie _stalych_ wartosci macierzy. | // 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). | 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; | + | |
+ | cout << "Macierz jednostkowa:" << endl << m << endl; | ||
+ | |||
// Odkomentowanie ponizszej linijki skutkuje bledem kompilacji, bez wzgledu na to, czy naruszymy reguly wartosci elementow macierzy jednostkowej, czy nie. | // Odkomentowanie ponizszej linijki skutkuje bledem kompilacji, bez wzgledu na to, czy naruszymy reguly wartosci elementow macierzy jednostkowej, czy nie. | ||
+ | |||
// m(0,0) = 1; | // m(0,0) = 1; | ||
+ | |||
} | } | ||
+ | |||
+ | |||
// Macierz zerowa | // Macierz zerowa | ||
+ | |||
{ | { | ||
+ | |||
// Tu rowniez inicjalizacja wszystkich elementow - na wartosci zerowe. | // Tu rowniez inicjalizacja wszystkich elementow - na wartosci zerowe. | ||
+ | |||
zero_matrix<double> m (3,4); // Mozliwy takze konstruktor z 1 argumentem - macierz kwadratowa. | zero_matrix<double> m (3,4); // Mozliwy takze konstruktor z 1 argumentem - macierz kwadratowa. | ||
- | std::cout << "Macierz zerowa:" << std::endl << m << std::endl; | + | |
+ | cout << "Macierz zerowa:" << endl << m << endl; | ||
} | } | ||
+ | |||
+ | |||
// Macierz skalarna | // Macierz skalarna | ||
+ | |||
{ | { | ||
+ | |||
scalar_matrix<double> m(3,3,4); // Macierz o wymiarach 3x3, wypelniona wartosciami 4. | scalar_matrix<double> m(3,3,4); // Macierz o wymiarach 3x3, wypelniona wartosciami 4. | ||
- | std::cout << "Macierz skalarna:" << std::endl << m << std::endl; | + | |
+ | cout << "Macierz skalarna:" << endl << m << endl; | ||
} | } | ||
+ | |||
+ | |||
+ | |||
// --------------------------------------- Triangular Matrix --------------------------------------- | // --------------------------------------- Triangular Matrix --------------------------------------- | ||
+ | |||
{ | { | ||
+ | |||
// Wypelnienie kolejnymi liczbami tylko dolnej czesci macierzy i glownej przekatnej, gdyz jest to macierz dolna, | // 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. | // a wiec elementy nad glowna przekatna maja wartosci 0 przypisane na stale w definicji. | ||
+ | |||
triangular_matrix<double, lower> tml (3, 4); | triangular_matrix<double, lower> tml (3, 4); | ||
+ | |||
for (unsigned i = 0; i < tml.size1 (); ++ i) // dla kazdego wiersza macierzy | 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 | for (unsigned j = 0; j <= i; ++ j) // dla kazdej kolumny macierzy, ale dla elementow pod glowna przekatna | ||
+ | |||
tml (i, j) = 3 * i + j; | tml (i, j) = 3 * i + j; | ||
- | std::cout << "Dolna macierz trojkatna:" << std::endl << tml << std::endl; | + | |
+ | cout << "Dolna macierz trojkatna:" << endl << tml << endl; | ||
+ | |||
// Definicja gornej jednostkowej macierzy trojkatnej. | // Definicja gornej jednostkowej macierzy trojkatnej. | ||
+ | |||
triangular_matrix<double, unit_upper> tmup (3, 3); | triangular_matrix<double, unit_upper> tmup (3, 3); | ||
+ | |||
// Wypelnienie liczbami tylko elementow nad glowna przekatna macierzy. | // Wypelnienie liczbami tylko elementow nad glowna przekatna macierzy. | ||
+ | |||
for (unsigned i = 0; i < tmup.size1 (); ++ i) // dla kazdego wiersza macierzy | for (unsigned i = 0; i < tmup.size1 (); ++ i) // dla kazdego wiersza macierzy | ||
+ | |||
// Wartosci na glownej przekatnej zostaly juz zainicjowane przy definicji macierzy, | // Wartosci na glownej przekatnej zostaly juz zainicjowane przy definicji macierzy, | ||
+ | |||
// dlatego petla wewnetrzna od j=i+1, a nie j=i. | // 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 | 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; | tmup (i, j) = 3 * i + j; | ||
- | std::cout << "Gorna jednostkowa macierz trojkatna:" << std::endl << tmup << std::endl; | + | |
+ | |||
+ | cout << "Gorna jednostkowa macierz trojkatna:" << endl << tmup << endl; | ||
+ | |||
// Proba zmiany wartosci na glownej przekatnej macierzy jednostkowej. | // Proba zmiany wartosci na glownej przekatnej macierzy jednostkowej. | ||
+ | |||
try { | try { | ||
- | std::cout << "Proba zmiany wartosci na glownej przekatnej gornej jednostkowej macierzy trojkatnej:" << std::endl; | + | |
+ | cout << "Proba zmiany wartosci na glownej przekatnej gornej jednostkowej macierzy trojkatnej:" << endl; | ||
tmup(0,0)=-1; // Ta linijka rzuci wyjatek, poniewaz w gornej _jednostkowej_ macierzy trojkatnej | tmup(0,0)=-1; // Ta linijka rzuci wyjatek, poniewaz w gornej _jednostkowej_ macierzy trojkatnej | ||
+ | |||
// mozemy zmieniac tylko wartosci pod glowna przekatna. | // mozemy zmieniac tylko wartosci pod glowna przekatna. | ||
+ | |||
} | } | ||
+ | |||
catch (std::exception &e){ | catch (std::exception &e){ | ||
- | std::cout << "Exception: " << e.what() << std::endl; | + | |
+ | cout << "Exception: " << e.what() << endl; | ||
} | } | ||
+ | |||
+ | |||
} | } | ||
+ | |||
// Triangular Adaptor | // Triangular Adaptor | ||
+ | |||
{ | { | ||
+ | |||
// Definicja macierzy gestej - adaptowanej. | // Definicja macierzy gestej - adaptowanej. | ||
+ | |||
matrix<double> m(3,3); | matrix<double> m(3,3); | ||
+ | |||
for (unsigned i = 0; i < m.size1 (); ++ i) // dla kazdego wiersza macierzy | for (unsigned i = 0; i < m.size1 (); ++ i) // dla kazdego wiersza macierzy | ||
+ | |||
for (unsigned j = 0; j < m.size2 (); ++ j) // dla kazdej kolumny 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. | m (i, j) = 3 * i + j + 1; // Przypisanie macierzy adaptowanej kolejnych liczb naturalnych. | ||
+ | |||
+ | |||
// Definicja dolnego adaptera macierzy gestej. | // Definicja dolnego adaptera macierzy gestej. | ||
+ | |||
triangular_adaptor<matrix<double>, lower> tal (m); | 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. | + | cout << "Dolny adapter trojkatny macierzy : " << m << " to: " << endl; |
+ | |||
+ | cout << tal << endl; // Elementy nad glowna przekatna maja wartosc 0. | ||
} | } | ||
+ | |||
+ | |||
// --------------------------------------- Symmetric Matrix --------------------------------------- | // --------------------------------------- Symmetric Matrix --------------------------------------- | ||
+ | |||
{ | { | ||
+ | |||
// Dolna macierz symetryczna. Wartosci nad glowna przekatna wskazuja na odpowiednie wartosci symetrycznych pod przekatna. | // Dolna macierz symetryczna. Wartosci nad glowna przekatna wskazuja na odpowiednie wartosci symetrycznych pod przekatna. | ||
+ | |||
symmetric_matrix<double, lower> sml (3, 3); | symmetric_matrix<double, lower> sml (3, 3); | ||
+ | |||
// Wystarczy przypisac wartosci czesci macierzy po jednej stronie glownej przekatnej, | // Wystarczy przypisac wartosci czesci macierzy po jednej stronie glownej przekatnej, | ||
+ | |||
// gdyz elementy po drugiej stronie wskazuja na swoich symetrycznych odpowiednikow. | // gdyz elementy po drugiej stronie wskazuja na swoich symetrycznych odpowiednikow. | ||
+ | |||
for (unsigned i = 0; i < sml.size1 (); ++ i) // dla kazdego wiersza macierzy | 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 | 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; | sml(i, j) = 3 * i + j + 1; | ||
+ | |||
// Modyfikacja wartosci id(i,j) powoduje modyfikacje takze id(j,i). | // Modyfikacja wartosci id(i,j) powoduje modyfikacje takze id(j,i). | ||
+ | |||
sml(1, 0)=-1; // Ten sam efekt, co instrukcja sml(0,1)=-1; | sml(1, 0)=-1; // Ten sam efekt, co instrukcja sml(0,1)=-1; | ||
- | std::cout << "Dolna macierz symetryczna: " << std::endl << sml << std::endl; | + | |
+ | cout << "Dolna macierz symetryczna: " << endl << sml << endl; | ||
} | } | ||
+ | |||
// Symmetric Adaptor | // Symmetric Adaptor | ||
+ | |||
{ | { | ||
+ | |||
// Macierz adaptowana. | // Macierz adaptowana. | ||
+ | |||
matrix<double> m(3,3); | matrix<double> m(3,3); | ||
+ | |||
for (unsigned i = 0; i < m.size1 (); ++ i) // dla kazdego wiersza macierzy | for (unsigned i = 0; i < m.size1 (); ++ i) // dla kazdego wiersza macierzy | ||
+ | |||
for (unsigned j = 0; j < m.size2 (); ++ j) // dla kazdej kolumny macierzy | for (unsigned j = 0; j < m.size2 (); ++ j) // dla kazdej kolumny macierzy | ||
+ | |||
m (i, j) = 3 * i + j + 1; | m (i, j) = 3 * i + j + 1; | ||
+ | |||
+ | |||
// Poniewaz adaptowanie przebiega w porzadku wierszowym, a nie kolumnowym, | // Poniewaz adaptowanie przebiega w porzadku wierszowym, a nie kolumnowym, | ||
+ | |||
// wartosci po gornej stronie glownej przekatnej wskazuja symetryczne wartosci spod glownej przekatnej, a nie odwrotnie. | // 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) | symmetric_adaptor<matrix<double> > sa (m); // Brak 2.argumentu klasy szablonu => wartosc domyslna (lower) | ||
+ | |||
+ | |||
// Dopiero tutaj widac roznice pomiedzy dolna a gorna macierza symetryczna. | // Dopiero tutaj widac roznice pomiedzy dolna a gorna macierza symetryczna. | ||
+ | |||
// Instrukcja zmiany wartosci adaptera zmienia oba symetryczne elementy obiektu adaptera macierzy. | // 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. | // 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; | 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; | + | cout << "Dolny adapter symetryczny stworzonej z macierzy gestej: " << m << " to: " << endl; |
+ | |||
+ | cout << sa << endl; | ||
} | } | ||
+ | |||
// --------------------------------------- Hermitian Matrix --------------------------------------- | // --------------------------------------- Hermitian Matrix --------------------------------------- | ||
+ | |||
{ | { | ||
+ | |||
// Deklaracja dolnej macierzy Hermitowskiej. | // Deklaracja dolnej macierzy Hermitowskiej. | ||
+ | |||
hermitian_matrix<std::complex<double>, lower> hml (3, 3); | hermitian_matrix<std::complex<double>, lower> hml (3, 3); | ||
+ | |||
for (unsigned i = 0; i < hml.size1 (); ++ i) { // dla kazdego wiersza macierzy | for (unsigned i = 0; i < hml.size1 (); ++ i) { // dla kazdego wiersza macierzy | ||
+ | |||
for (unsigned j = 0; j < i; ++ j) // dla kazdej kolumny 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, 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 | hml (i, i) = std::complex<double> (4 * i, 0); // wartosci na glownej przekatnej | ||
+ | |||
} | } | ||
- | std::cout << "Dolna macierz Hermitowska:" << std::endl << hml << std::endl; | + | |
+ | cout << "Dolna macierz Hermitowska:" << endl << hml << endl; | ||
} | } | ||
+ | |||
// Hermitian Adaptor - analogicznie do innych adapterow. | // Hermitian Adaptor - analogicznie do innych adapterow. | ||
+ | |||
+ | |||
// --------------------------------------- Banded Matrix --------------------------------------- | // --------------------------------------- Banded Matrix --------------------------------------- | ||
+ | |||
{ | { | ||
+ | |||
signed l=1, u=1; // l,u - ilosc niezerowych przekatnych pod,nad przekatna glowna | 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 | banded_matrix<double> bm (3, 3, l, u); // l=1, u=1 | ||
+ | |||
// Dla wszystkich wierszy. | // Dla wszystkich wierszy. | ||
+ | |||
for (signed i = 0; i < signed (bm.size1 ()); ++ i) // dla kazdego wiersza macierzy | for (signed i = 0; i < signed (bm.size1 ()); ++ i) // dla kazdego wiersza macierzy | ||
+ | |||
// Dla kolumn, ktorych indeks nalezy do przedzialu [-l,u) wzgledem | // 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) | for (signed j = std::max (i - l, 0); j < std::min (i + u, signed (bm.size2 ())); ++ j) | ||
+ | |||
bm (i, j) = 3 * i + j + 1; | bm (i, j) = 3 * i + j + 1; | ||
- | std::cout << "Macierz wstegowa:" << std::endl << bm << std::endl; | + | |
+ | cout << "Macierz wstegowa:" << endl << bm << endl; | ||
// bm(2,0)=0; // ta instrukcja generuje wyjatek | // bm(2,0)=0; // ta instrukcja generuje wyjatek | ||
+ | |||
} | } | ||
+ | |||
// Banded Adaptor - analogicznie do innych adapterow. | // Banded Adaptor - analogicznie do innych adapterow. | ||
+ | |||
} | } | ||
+ | |||
</code> | </code> | ||
Linia 333: | Linia 504: | ||
- | --- //[[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]]// |