gonum.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:
|
|