| gonum_output_as_comments.go | |
|---|---|
| Knihovna Gonum |  | 
| Úvodní informace o knihovně Gonum |  | 
| Samotný programovací jazyk Go obsahuje podporu pro práci s maticemi a řezy (ostatně se jedná o základní datové typy tohoto jazyka). Práce s těmito datovými strukturami je podporována i ve standardní knihovně jazyka. Ovšem například v porovnání se známou a velmi často používanou knihovnou NumPy ze světa Pythonu (nebo s možnostmi Matlabu či R) jsou možnosti standardní instalace Go v této oblasti mnohem menší. Ovšem některé operace, které známe z NumPy, byly implementovány v sadě knihoven, které jsou součástí projektu nazvaného jednoduše Gonum Numerical Packages. Tento projekt obsahuje zejména knihovnu pro práci s maticemi (naprosté základy si ukážeme níže), algoritmy lineární algebry, podporu pro tvorbu grafů, podporu práce s takzvanými "datovými rámci" (ve světě Pythonu se pro tento účeů používá pandas) atd. |  | 
| 
 |  | 
| Nyní, pokud máme nainstalován projekt Gonum, si můžeme ukázat, jak se manipuluje s maticemi, které v oblasti numerických výpočtů mnohdy představují základní datový typ. |  | 
| Používat budeme dva balíčky - standardní balíček fmt a balíček mat z knihovny Gonum: |  | 
| V tomto studijním materiálu využijeme jednu velmi užitečnou vlastnost programovacího jazyka Go - automatické odvození typu proměnné na základě její hodnoty. Zajímavé informace o této vlastnosti programovacího jazyka Go lze najít na této adrese popř. přímo na stránkách Rootu. |  | 
| Jediným problémem je, že deklaraci proměnné s automatickým odvozením typu lze provést uvnitř funkcí, takže všechny další příkazy umístíme (pro jednoduchost) přímo do funkce main: |  | 
| Matice |  | 
| Pro reprezentaci matic se používá několik struktur. Základem je je dense matrix používaná pro matice běžné velikosti, které obsahují libovolné prvky (a kde typicky nepřevažují prvky nulové): |  | 
| Matici lze přímo vytisknout, ovšem výsledek nebývá příliš čitelný, protože se vytiskne interní reprezentace matice v operační paměti |  | 
| Podporováno je i naplnění matice daty - postačuje namísto třetího
parametru, v němž jsme v předchozí deklaraci použili  |  | 
| 
 |  | 
| Zobrazení vybraného obsahu rozsáhlých matic |  | 
| Nyní se pokusme vytvořit relativně velkou matici o rozměrech 100x100 prvků: |  | 
| Tuto matici můžeme naplnit daty, a to pomocí metody  |  | 
| Přímý tisk hodnoty takové matice ovšem není v žádném případě přehledný: |  | 
| Výhodnější je použití funkce  |  | 
| S mnohem čitelnějšími výsledky: |  | 
| Podobný příkaz, ovšem pro mezních pět řádků a sloupců: |  | 
| S výsledky: |  | 
| Transpozice a součet matic |  | 
| Mezi další podporované základní maticové operace patří transpozice a součet matic. |  | 
| Nejdříve nadeklarujeme novou proměnnou určenou pro uložení výsledku (nealokuje se žádná další paměť) |  | 
| Dále vytvoříme dvě matice se třemi řádky a čtyřmi prvky na řádku |  | 
| Obě matice vytiskneme v čitelném formátu |  | 
| Obsah matic  |  | 
| Transponovaná matice |  | 
| Výpočet transponované matice s jejím následným vytištěním se provede
zavoláním metody nazvané jednoduše  |  | 
| Výsledek - transponovaná matice: |  | 
| Součet matic |  | 
| Součet matic o stejné velikosti je řešen metodou  |  | 
| Výsledek: |  | 
| 
 |  | 
| Maticový součin a podobné operace |  | 
| Podporována je i operace maticového součinu, ale pochopitelně pouze
za předpokladu, že počet sloupců první matice odpovídá počtu řádků
matice druhé. Pokud matice  |  | 
| Výsledek: |  | 
| Násobení prvek po prvku |  | 
| Provést lze i násobení dvou matic prvek po prvku (což ovšem neodpovídá maticovému násobení): |  | 
| Výsledek: |  | 
| Jednorozměrné vektory |  | 
| V předchozím textu jsme se zabývali převážně popisem práce s běžnými čtvercovými a obdélníkovými maticemi, i když možnosti tohoto balíčku jsou ve skutečnosti větší. Pracovat lze i s vektory, které jsou (minimálně z pohledu balíčku mat) sloupcové. Výchozím typem vektorů je datová struktura vecdense představující vektor s měnitelnými (mutable) prvky. Interně se jedná o pole prvků, a proto je zde použito slovo "dense". |  | 
| Nový sloupcový vektor se vytvoří konstruktorem nazvaným NewVecDense, a to následujícím způsobem: |  | 
| Vektor lze pochopitelně vytisknout |  | 
| Jak jsme si již řekli v předchozím odstavci, jedná se o sloupcový vektor: |  | 
| V případě, že budeme chtít vektor inicializovat prvky se známou hodnotou, použijeme sice stejný konstruktor, ale namísto druhé hodnoty nil lze předat řez s hodnotami typu float64. Volání konstruktoru tedy bude vypadat následovně: |  | 
| U vektorů lze zjistit jejich velikost (délka zde vlastně odpovídá výšce) a taktéž kapacitu |  | 
| Metoda Dims vrací dimenzi vektoru - n řádků a jeden sloupec: |  | 
| Pochopitelně je možné vytvořit i řádkový vektor o to maticovou operací transpozice zapisovanou metodou se jménem  |  | 
| S tímto výsledkem |  | 
| 
 |  | 
| Získání řezu (slice) z vektoru |  | 
| Často je zapotřebí z vektoru získat pouze určitou část. V případě
polí a řezů (jakožto základních datových typů programovacího jazyka
Go) je pro tento účel použit operátor řezu (slice), ovšem u
vektorů typu vecdense je namísto toho nutné použít metodu nazvanou
 |  | 
| Nejprve vytvoříme nový vektor s deseti prvky |  | 
| Následně vytvoříme řez tvořený prvky s indexy 4 a 5 (tedy kromě prvku číslo 6) |  | 
| Který běžným způsobem vytiskneme |  | 
| Výsledkem by měl být vektor se dvěma prvky vypadající následovně |  | 
| 
 |  | 
| Podobně lze vytvořit řez obsahující všechny původní prvky |  | 
| Výsledkem by měl být vektor se stejnými prvky jako vektor původní |  | 
| Indexy prvků musí být kladná čísla - jinými slovy to znamená, že není povoleno počítat indexy od konce vektoru tak, jak to známe z některých jiných knihoven. Pokus o indexaci záporným číslem povede k pádu programu, proto musíme (pro účely tohoto učebního materiálu) tento pád zachytit a zpracovat. |  | 
| mat.Formatted(v.SliceVec(0, -1)) |  | 
| Řez vektoru je skutečným řezem ve smyslu, že se jedná o "pohled" na
původní vektor. V dalším příkladu vytvoříme řez nazvaný  |  | 
| Výsledek získaný již známou funkcí  |  | 
| Čtení a modifikace prvků vektoru |  | 
| Způsob nastavení nové hodnoty prvku vektoru jsme již viděli v
předchozí podkapitole. Pro tento účel se používá metoda nazvaná
 |  | 
| Změněný vektor bude mít opět deset prvků |  | 
| Existují dvě metody určené pro přečtení hodnoty prvku z vektoru. První
metoda se jmenuje  |  | 
| Druhá metoda se jmenuje  |  | 
| Další podporované operace nad vektory |  | 
| V této podkapitole si popíšeme některé další operace, které lze provádět s vektory. Nejdříve vytvoříme dvojici vektorů, které budou použity v dalších příkazech. Obsah těchto vektorů si necháme vypsat na standardní výstup. |  | 
| Třetí vektor bude použit jako cíl pro některé vybrané operace |  | 
| Součet vektorů |  | 
| Operace součtu dvou vektorů realizovaná metodou  |  | 
| Součet vektoru  |  | 
| Rozdíl vektorů |  | 
| Operace rozdílu vektorů, opět s modifikací příjemce |  | 
| Změna měřítka (natažení...) |  | 
| Změna měřítka, tj. vynásobení všech prvků vektoru nějakou
konstantou, se realizuje metodou nazvanou  |  | 
| Vynásobení korespondujících prvků vektorů |  | 
| Vynásobení dvou vektorů stylem prvek po prvku (nejedná se o vektorový součin) |  | 
| Součin matice a vektoru |  | 
| Podporována je i operace vynásobení matice a vektoru, samozřejmě za
předpokladu, že počet sloupců matice bude odpovídat počtu řádků
sloupcového vektoru. Vytvoříme tedy matici o rozměrech 3x3 prvky,
sloupcový vektor se třemi prvky a provedeme vynásobení matice a
vektoru. Vektor  |  | 
| Vynásobení vektoru maticí reprezentující otočení okolo z-ové osy o 90 stupňů by mohlo být realizováno následujícím kódem |  | 
| Skalární součin |  | 
| Skalární součin dvou vektorů o stejné velikosti se provádí funkcí
 |  | 
| Získání prvku s největší a nejmenší hodnotou: |  | 
| Součet všech prvků vektoru: |  | 
| Práce s obecnými dvourozměrnými maticemi |  | 
| Obecnou dvourozměrnou matici vytváříme konstruktorem  |  | 
| Konstrukce matice s inicializací jejich prvků se provede předáním řezu s hodnotami prvků |  | 
| Třetí matice, tentokrát se třemi řádky a čtyřmi sloupci |  | 
| Čtvercová matice 3x3 prvky |  | 
| Přečtení sloupce z matice |  | 
| Přečtení i-tého sloupce matice zajišťuje metoda  |  | 
| Přečtení řádku z matice |  | 
| Přečtení j-tého řádku matice je provedeno metodou  |  | 
| Výpočet determinantu |  | 
| O výpočet determinantu matice 3x3 prvky se stará metoda nazvaná
 |  | 
| Prvek s minimální a maximální hodnotou, součet hodnot prvků |  | 
| Opět můžeme použít funkce pro získání prvku s nejmenší hodnotou,
největší hodnotou a pro součet (sumu) všech prvků v matici.
Příslušné metody mají stejný název jako v případě vektorů, tedy
 |  | 
| Získání diagonální matice |  | 
| Poslední zajímavou metodou určenou pro zpracování matic je metoda, která vrací diagonální matici (všechny prvky kromě prvků na hlavní diagonále jsou nulové) |  | 
| Symetrické matice |  | 
| V knihovně mat existuje i konstruktor pro symetrické matice. Chování tohoto konstruktoru je ovšem poněkud zvláštní - předat je mu totiž nutné všechny prvky odpovídající velikosti matice. Například pro matici 3x3 prvky (symetrická matice je vždy čtvercová) je nutné konstruktoru předat devět hodnot prvků, i když se z těchto hodnot použije jen šest prvků (horní trojúhelníková matice). Toto chování odlišuje mat od podobně koncipovaných knihoven známých z jiných programovacích jazyků. |  | 
| Symetrické matice zachovávají většinu základních vlastností běžných matic, tj. můžeme například získat informace o jejich kapacitě, velikosti (v jednotlivých dimenzích) atd.: |  | 
| Vytvořit je možné i transformovanou matici, což je ovšem jen kopie matice původní: |  | 
| Prvky symetrické matice se nastavují metodou  |  | 
| Diagonální matice |  | 
| Další variantou matic jsou diagonální matice. Ty lze vytvořit
konstruktorem  |  | 
| Konstruktoru je možné předat hodnoty všech prvků na hlavní diagonále: |  | 
| A opět jsou k dispozici metody pro získání základních informací o existující matici |  | 
| Pro nastavení hodnoty prvku diagonální matice se používá metoda
nazvaná  |  | 
| Trojúhelníkové matice |  | 
| V knihovně mat jsou vývojářům k dispozici i funkce a metody
určené pro práci s trojúhelníkovými maticemi. Opět si nejprve
řekněme, jakým způsobem se tyto matice vytváří. Použít můžeme
konstruktor  |  | 
| Horní trojúhelníková matice se vytváří s využitím konstanty
 |  | 
| Dolní trojúhelníková matice inicializovaná shodnými hodnotami se konstruuje následovně |  | 
| Získat můžeme pohled obsahující pouze prvky na hlavní diagonále: |  | 
| Trojúhelníkové matice lze transponovat, čímž se z horní matice stane dolní a naopak |  | 
| Pro nastavení hodnot prvků trojúhelníkové matice slouží metoda
 |  | 
| toto provést nelze nelze: t3.SetTri(2, 0, 100) vedlo by k chybě při běhu: |  | 
|  |  | 
| Prvek ve třetím sloupci a na prvním řádku naopak změnit bez problémů lze, protože se jedná o horní trojúhelníkovou matici |  | 
| Další informace o datových typech, metodách a funkcích poskytovaných balíčkem mat naleznete na stránce https://godoc.org/gonum.org/v1/gonum/mat |  | 
| finito █ |  | 
| Odkazy pro další studium: 
 |  |