Search
Napište modul, který bude definovat strukturu matic a bude s nimi provádět různé operace. Matice musí uchovány v instancích objektů třídy Matrix. Část struktury třídy “Matrix” a rozhraní funkcí určených k implementaci je předem dané. Součástí zadání jsou 3 soubory zdrojových kódů:
Matrix
main.cpp
matrix.hpp
matrix.cpp
Testování probíhá ve dvou úrovních, označovaných L1 a L2, pro každou z úrovní je třeba naprogramovat některé z funkcí uvedených v hlavičkovém souboru matrix.hpp. V komentářích hlavičkového souboru je uvedeno, do které úrovně funkce patří.
Úroveň L1 je ohodnocena 3 body, úroveň L2 ohodnocena taktéž 3 body. Obě úrovně je potřeba splnit.
Třída Matrix musí obsahovat proměnné s viditelností public:
public
nrows
nrows>=0
ncols
ncols>=0
Data matice uchovejte v libovolné vhodné formě. Je výhodné využít knihovnu standadních šablon.
Třída Matrix definovat následující konstruktory:
Matrix(int rows, int cols);
rows
cols
Matrix(int rowscols=0);
rowscols
0x0
Matrix(const Matrix &m);
matrix_negative_size
Pro jednotlivé úrovně testování je třeba implementovat následující funkce a operátory třídy Matrix:
void Matrix::zeros()
0
void Matrix::uniform(value element)
element
void Matrix::eye()
1
void Matrix::bias(value b)
b
bool operator == (const Matrix & m)
true
Matrix & operator=(const Matrix &m)
value Matrix::operator () (int row, int col) const
std::out_of_range(“Row index is out of range”)
std::out_of_range(“Column index is out of range”)
value & Matrix::operator () (int row, int col)
void Matrix::scale(value s)
s
void Matrix::transpose()
Pro jednotlivé úrovně testování je třeba implementovat následující funkce a operátory mimo třídu Matrix:
std::ostream & operator « (std::ostream & os, const Matrix & m)
m
std::endl
void loadMatrixFile(Matrix &m, std::string fname)
fname
Matrix operator + (const Matrix & lhs, const Matrix & rhs)
matrix_bad_sizes
Matrix operator + (const value & lhs, const Matrix & rhs)
Matrix operator + (const Matrix & lhs, const value & rhs)
Matrix operator - (const Matrix & lhs, const Matrix & rhs)
Matrix operator - (const value & lhs, const Matrix & rhs)
Matrix operator - (const Matrix & lhs, const value & rhs)
Matrix operator * (const Matrix & lhs, const Matrix & rhs)
Matrix operator * (const value & lhs, const Matrix & rhs)
Matrix operator * (const Matrix & lhs, const value & rhs)
Matrix hadamard (const Matrix & lhs, const Matrix & rhs)
Matrix power (const Matrix & m, unsigned int pow)
power(A, 3)
A*A*A
0x5
5×0
Výjimky, které mají být vyvolány jsou v matrix.hpp definovány následovně:
// Vyjimka pri spatnych rozmerech matice pro danou operaci: struct matrix_bad_sizes: public std::exception {const char * what () const throw (){return "matrix_bad_sizes";}}; // Vyjimka pri zadani negativniho rozmeru struct matrix_negative_size: public std::exception {const char * what () const throw (){return "matrix_negative_size";}}; // Vyjimka pri chybe nacteni rozmeru matice struct matrix_in_bad_header: public std::exception {const char * what () const throw (){return "matrix_in_bad_header";}}; // Vyjimka pri chybe nacteni prvku matice struct matrix_in_bad_body: public std::exception {const char * what () const throw (){return "matrix_in_bad_body";}}; // Vyjimka pri otevirani souboru matice struct cannot_open_file: public std::exception {const char * what () const throw (){return "cannot_open_file";}};
Program bude zavolán příkazem ./main -l1 nebo ./main -l2. Samotný program 'main' poté provádí řadu testů funkcí modulu 'matrix', který naprogramujete. V průběhu se program pokusí načíst několik matic ze souborů. Formát souboru matice je následující:
./main -l1
./main -l2
* Na prvním řádku jsou dvě čísla - počet řádků a počet sloupců. * Na dalších řádcích jsou po řádcích hodnoty prvků matice oddělené mezerami.
Příklad obsahu souboru matice:
4 6 -54 -36 -37 -49 59 -33 -80 57 -93 -36 94 24 -48 -45 -55 -48 -98 -68 28 24 -31 -83 -89 75
Při načítání soubodu musí být vyvolána výjimka když:
* když je chyba v řádku hlavičky - chybí číslo, nebo se tam objeví písmeno. * když chybí data - nějaký řádek je příliš krátký, nebo úplně chybí. * když se mezi data zatoulá písmeno
Nemusíte kontrolovat, zdanení řádek příliš dlouhý, nebo jestli nepřebývají řádky. Data navíc se ignorují. Testovací matice jsou k dispozici v balíčku zadání. Při náhodném testu se některé z matic mohou změnit.
Výstupem programu je výpis testovacího protokolu. Příklady testovacích protokolů pro jednotlivé úrovně jsou dostupné v balíčku zadání. Některé testy vypisují celou matici, některé Pass nebo Fail, některé název výjimky, která byla vyvolána.
Pass
Fail
K výpisu celé matice je využitý vždy operátor «, který máte naprogramovat. Příklad výstupu celé matice:
«
26 -57 99 -73 61 -8 -23 96 16 57 97 17 23 91 -95 -25
Při náhodném testu jsou spuštěny stejné testy, pouze je náhodně změněn obsah některých souborů matic. Mohou se změnit i rozměry matic.
Bonusovým zadáním je implementace funkcí úrovně označené L3.
Matrix::Matrix(const std::vector<value> &v)
v
diag()
std::vector<value> operator () (void) const
void Matrix::changedim(int rows, int cols)
Matrix horzcat (const Matrix & lhs, const Matrix & rhs)
[lhs, rhs]
Matrix vertcat (const Matrix & top, const Matrix & bot)
[top; bot]
Matrix blkdiag (const Matrix & lhs, const Matrix & rhs)
1×1
Matrix blkdiag (const value & lhs, const Matrix & rhs)
Matrix blkdiag (const Matrix & lhs, const value & rhs)
Matrix blkdiag (const value & lhs, const value & rhs)
Matrix kronecker (const Matrix & lhs, const Matrix & rhs)
./main -l3
Odevzdává se balík s jakýmkoliv počtem souborů cpp nebo hpp s tím, že hlavní soubor main.cpp není třeba připojovat, bude nahrazen standardním souboraem, který je přiložen v šabloně HW04.zip .
-l1
-l2
-l3