Semestrální projekt Předmět: Programování v jazyce C
Zadání: Operace s maticemi
Uživatelský manuál
ver. 1.0
Jakub Štrouf Obor: Aplikovaná informatika Semestr: 1. Rok: 2009/2010
Obsah: 1. Úvod 1.1. Technická podpora 1.2. Systémové požadavky 1.3. Instalace 2. Uživatelské rozhraní 2.1. Představení programu 3. Zadávání matic 3.1. Zadávání rozměrů 3.1.1. Vektory 3.1.2. Čtvercové matice 3.1.3. Obecné matice 3.1.4. Skalár 3.2. Zadávání hodnot 4. Volení operací s maticemi 4.1. Sčítání 4.2. Rozdíl 4.3. Násobení 4.4. Podíl 4.5. Skalární násobení 4.6. Výpočet determinantu 4.7. Transponování matice 4.8. Adjungovaná matice 4.9. Inverzní matice 5. Hlavičkové funkce 6. Použitá literatura a zvláštní poděkování
1. Pár slov úvodem Tento program byl vytvořen v rámci semestrálního projektu v předmětu „Programování v jazyce C“ v prvním semestru na oboru „Aplikovaná informatika“. MathMatrix je komplexní program pro základní operace se dvěma maticemi (např. sčítání, rozdíl, násobení, transponování…). V tomto manuálu se dozvíte jak s programem správně pracovat pro využití všech jeho funkcí. Jak správně zadávat matice, čísla do matic a volit funkce. Děkuji Vám za Vaši důvěru a přeji Vám mnoho úspěchů a potěšení při používání aplikace MathMatrix. Informaci o aplikaci a o dalších produktech lze získat u autora kterého lze kontaktovat na webové adrese www.asuanweb.wz.cz v odkazu „Názor na web“ v menu stránky.
1.1.
Technická Podpora Technická podpora bohužel není možná z důvodu jednorázového účelu aplikace.
1.2.
Systémové požadavky Před spuštěním se ujistěte že jsou splněny systémové požadavky: Operační systém: Windows 2000 s SP2 či více Operační paměť: minimálně 15MB Místo na disku: minimálně 1MB (včetně manuálu) Pro otevření manuálu je zapotřebí jedna z těchto aplikací Microsoft Word (verze 2003 a vyšší) Adobe Acrobat Reader (verze 7.0 a vyšší)
1.3.
Instalace
Aplikaci není nutno instalovat lze pouze nakopírovat a lze ji rovnou používat popř. ji lze znovu zkompilovat z přiložených zdrojových kódů v jakémkoli kompilátoru jazyka C.
2. Uživatelské rozhraní 2.1.
Představení programu
3. Zadávání matic První o co budete v aplikaci požádáni budou rozměry obou matic se kterými později budete provádět později vysvětlené operace. Matice jsou označeny A a B, výsledná matice pak C u které jsou rozměry automaticky voleny podle zvolené operace. Každá operace je ošetřena na rozměry vstupních matic, pokud rozměry neodpovídají potřebným rozměrům pro danou operaci je program ukončen, proto pokud předem víte kterou operaci hodláte použít zvolte vhodně rozměry obou matic aby jste si ušetřili problémy v podobě opětovného spuštění aplikace a opětovného zadávání hodnot do matic. Předem Vás žádám o zadávání rozumných rozměrů matic a to ze dvou důvodů, prvním je, že budete muset m*n počet prvků a druhým je náročnost na operační paměť přidělenou operačním systémem a tudíž nebezpečí že dojde.
3.1.
Zadávání rozměrů matic
3.1.1. Vektory Neboli jednořádkové/jednosloupcové matice lze zadat vždy zvolením za jeden rozměr jednotku. Např. matice A: řádkový vektor, B: sloupcový vektor
3.1.2. Čtvercové matice Čtvercová matice je matice s oběma rozměry stejnými. Tento typ matice je nezbytný pro operaci výpočtu determinantu. Příklad čtvercové matice A která má rozměry 5x5
3.1.3. Obecné matice Obecná matice má různé rozměry. Speciálními případy obecné matice jsou vektory, čtvercové matice či skalár. Obecné matice jsou vhodné např. pro operace typu součet, rozdíl, násobení, skalární součin a transponování matic. Příklad obecné matice A s rozměry 2x5
3.1.4. Skalár Skalár je jednorozměrnou maticí, má tudíž oba rozměry rovny jedné. Jedná se o speciální případ čtvercové matice. Se skalárem lze provádět např. následující operace: součet, rozdíl, násobení dvou skalárů, násobení skaláru a matice (zprava i zleva), výpočet determinantu ze skaláru. Příklad zadávání skaláru jako matice A
3.2.
Zadávání hodnot do matic
Hodnoty do matic lze zadávat dvěma způsoby, buďto ručně nebo z přeformátovaného souboru. Pokud se rozhodnete zadávat hodnoty ručně stiskněte „r“. Poté budete vyzváni k zadávání hodnot, pro potvrzení hodnoty stiskněte „Enter“. Po zadání všech hodnot budete požádáni jestli chcete tyto hodnoty uložit do externího souboru. Pokud ano stiskněte „a“ pokud ne stiskněte „n“ či jiné tlačítko. Pokud se rozhodnete načíst hodnoty ze souboru stiskněte „s“ či jiné tlačítko a matice bude automaticky načtena z externího souboru. Pokud tento externí soubor dosud neexistuje budete požádáni o ruční zadání a následně opět vyzváni zda chcete tyto hodnoty uložit. Hodnoty v předpřipravených externích souborech byly vygenerovány náhodně.
4. Volení operací s maticemi Po zadání rozměrů a vyplnění matic všemi prvky budete požádáni o zvolení následujících operací, každá operace je charakterizována operátorem a operace je zvolena po stisknutí tohoto operátoru na klávesnici (neentruje se). Operátory jsou uvedeny v závorce vedle nadpisu a zároveň v popisu dané operace. Nezapomeňte si uvědomit která operace požaduje jaké rozměry obou matic, v případě nedodržení bude aplikace ukončena.
4.1.
Sčítání (‚+‘)
Sčítání lze provádět pouze s maticemi o stejných rozměrech, či dvou skalárů. Sčítání je prováděno součtem prvků se stejnými souřadnicemi v obou maticích. Výsledná matice má stejné rozměry jako obě původní matice. Operátor pro sčítání je ‚+‘. Příklad součtu dvou matic o rozměrech 2x3
4.2.
Rozdíl (‚-‘)
Rozdíl lze provádět pouze s maticemi o stejných rozměrech, či dvou skalárů. Rozdíl je prováděn rozdílem prvků se stejnými souřadnicemi v obou maticích. Výsledná matice má stejné rozměry jako obě původní matice. Rozdíl je pouze A-B, proto dbejte pozoru při zadávání prvků do obou matic. Operátor pro rozdílu je ‚-‘. Příklad rozdílu dvou matic o rozměrech 2x3
4.3.
Násobení (‚*‘)
Násobení lze provádět pouze s maticemi kdy druhý rozměr první matice musí být stejný jako první rozměr druhé matice. Výsledná matice má pak rozměry první rozměr první matice na druhý rozměr druhé matice. Výpočet je prováděn stylem řádek první a sloupec druhé. Násobení je pouze A*B, proto dbejte pozoru při zadávání prvků do obou matic. Speciální operací je násobení skaláru a matice. Je-li jedna z matic skalárem, je tento skalár vynásoben s každým prvkem matice. Výsledná matice má pak rozměry vstupní matice. Jsou-li obě matice skalárem pak jsou vynásobeny tyto skaláry a výsledná matice je též skalárem. Operátor pro násobení je ‚*‘ Příklad násobení matic 2x3 a 3x4 (výsledná matice 2x4)
4.4.
Podíl (‚/‘)
Podíl lze provádět pouze se čtvercovými maticemi stejného řádu (např. A=4x4, B=4x4). Výsledná matice má pak stejné rozměry jako vstupní matice. Výpočet je prováděn podle vzorce A*C=B => C=A-1*B, proto dbejte pozoru při zadávání prvků do obou matic. Pokud chcete matici dělit skalárem využijte prosím násobení. Operátor pro podíl je ‚/‘
4.5.
Skalární násobení (‚.‘)
Skalární násobení lze provádět pouze s maticemi o stejných rozměrech, či dvou skalárů. Toto násobení se provádí obdobně jako sčítání. Výsledná matice má stejné rozměry jako obě původní matice. Speciální operací je násobení skalárů. Jsou-li obě matice skalárem pak jsou vynásobeny tyto skaláry a výsledná matice je též skalárem. Operátor pro skalární násobení je ‚.‘ (tečka). Příklad skalárního násobení dvou matic o rozměrech 2x3
4.6.
Výpočet determinantu (‚d‘) Výpočet determinantu je prováděn čtyřmi způsoby a to dle velikosti vstupní matice. 1. způsob: Je-li vstupní matice skalárem pak výsledná matice je také skalárem o stejné hodnotě. 2. způsob: Je-li matice typu 2x2 pak je použito tzv. křížové pravidlo. 3. způsob: Je-li matice typu 3x3 pak je matice řešena Frajerovým pravidlem 4. způsob: Je-li matice vyššího řádu jak 3 je řešena pomocí Laplaceova rozvoje
Výpočet determinantu lze použít POUZE na čtvercové matice či skaláry, pokud vstupní matice nebude čtvercová či skalár bude toto oznámeno a program bude ukončen. Časová složitost algoritmu je exponenciální proto nezadávejte příliš velké rozměry počítané matice. Po stisknutí operátoru pro determinant budete dotázáni ze které ze dvou matic se determinant bude počítat, zadávejte pouze velká písmena. Operátor pro výpočet determinantu je ‚d‘ Příklad výpočtu determinantu z matice druhého řádu
4.7.
Transponování matice (‚t‘)
Při transponování matice se z praktického hlediska provádí osová symetrie podle hlavní diagonály, či přepsání sloupců do řádků. Výsledná matice pak má opačné rozměry než matice vstupní. Použít se dají všechny typy matic. Po stisknutí operátoru pro transponování budete dotázáni která ze dvou matic se bude transponovat, zadávejte pouze velká písmena. Operátor pro transponování je ‚t‘ Příklad transponované matice 3x5 na matici 5x3
4.8.
Adjungovaná matice (‚a‘)
Lze požít pouze na čtvercové matice. Výsledná matice má pak rozměry vstupní matice. Tato operace využívá operace determinant. Časová složitost algoritmu je exponenciální proto nezadávejte příliš velké rozměry počítané matice. Po stisknutí operátoru pro transponování budete dotázáni která ze dvou matic se bude transponovat, zadávejte pouze velká písmena. Operátor pro adjungování matice je ‚a‘
4.9.
Inverzní matice (‚i‘)
Lze požít pouze na čtvercové matice. Výsledná matice má pak rozměry vstupní matice. Tato operace využívá operace determinant a adjungování matice. Časová složitost algoritmu je exponenciální proto nezadávejte příliš velké rozměry počítané matice. Po stisknutí operátoru pro transponování budete dotázáni která ze dvou matic se bude transponovat, zadávejte pouze velká písmena. Operátor pro inverzní matici je ‚i‘
5. Hlavičkové funkce 5.1. "IO_matrix.h" void ReadDimension(int *x, int *y) Procedura vrací rozměry pro dvourozměrné pole. void ReadMatrix(float *matrix, int x, int y ,char name) Procedura se využívá pro naplnění dvourozměrného pole *matrix, které je definováno pointrem na adresu počátku alokované paměti, hodnotami. Dalšími vstupními parametry jsou rozměry daného pole a název zadávané matice. void PrintMatrix(float *matrix, int x, int y, char name) Procedura vypíše matici *matrix, která je definována pointrem na adresu počátku alokované paměti. Dalšími vstupními parametry jsou rozměry x, y a název dané matice.
5.2. "matrix_operations.h" void Matrixsum(float *c, float *a, char sign, float *b, int dxa, int dya, int dxb, int dyb) Procedura vrací součet vstupních matic. Parametry *c - pointr na výslednou matici *a - pointr na 1. vstupní matici *b - pointr na 2. vstupní matici sign - znaménko prováděné operace („ + “, „ - “ či „ . “) dxa, dya - rozměry 1. matice dxb, dyb - rozměry druhé matice void MatrixMultiply(float *a, float *b, float *c, int dxa, int dya, int dxb, int dyb, int *dxc, int *dyc) Procedura vrací násobení dvou matic. Parametry *a - pointr na 1. vstupní matici *b - pointr na 2. vstupní matici *c - pointr na výslednou matici dxa, dya - rozměry 1. matice dxb, dyb - rozměry druhé matice *dxc, *dyc - pointr na rozměry výsledné matice void MatrixTrans(float *a, float *at, int x, int y) Procedura transponuje matici *a a tuto transponovanou matici vrátí na adresu uloženou v *at. Dalším vstupem jsou rozměry x, y původní matice. double Determinant(float *mat, const int n) Funkce vrací determinant vstupní matice *mat o rozměrech x, y. void AdjMatrix(float *mat, float *madj, int x, int y) Procedura vrací adjungovanou matici od matice *mat o rozměrech x, y na pointr *madj. void InvertMatrix(float *mat, float *imat, int x, int y) Procedura vrací invertovanou matici od matice *mat o rozměrech x, y na pointr *imat.
6. Použitá literatura Především internet: Gogole.cz www.sallyx.org
Zvláštní poděkování Beta testeři: Lukáš Kučera, Milan Fašina, Ján Švec (Linux tester)