Portál AbcLinuxu, 10. června 2024 13:01

Octave - 3 (přístup k jednotlivým položkám matice)

1. 2. 2006 | Jiří Poláček
Články - Octave - 3 (přístup k jednotlivým položkám matice)  

Naplnění matice funkcí, rozměry matice, operátor dvojtečka, přístup k jednotlivým složkám vektoru a matice.

Naplnění matice funkcí

V minulém díle (Octave - 2 (počítání s maticemi)) jsme si ukázali vytvoření matice ručně - výčtem hodnot. Matici můžeme získat i jinak - Octave disponuje celou řadou funkcí pro tvorbu matic určitého typu. S výjimkou permutace mají všechny níže uvedené funkce dva parametry, kterými říkáme, kolik řádků a kolik sloupců má výsledná matice mít (vhodnými parametry jsou tedy pouze kladná čísla). Pokud uvedeme pouze jeden parametr, výsledná matice bude čtvercová. Funkce jsou tedy následující:

Příklady pro představu:

>> zeros(2,4)
ans =
  0  0  0  0
  0  0  0  0
>> 4 * ones(2,3)
ans =
  4  4  4
  4  4  4
>> eye(3)
ans =
  1  0  0
  0  1  0
  0  0  1
>> randn(2,5)
ans =
   1.324077  -0.408510   1.516083  -0.372057  -0.138184
   0.787720  -0.186652   0.079070   0.056826   1.679005
>> floor(rand(4,6)*20)+1 % Chceme celá čísla od 1 do 20
ans =
   3  10   2   6   5  16
   6   4  10   8  19   9
  18  20   1  18  13   8
  17   8  13   7  12  20
>> randperm(8)
ans =
  4  6  5  7  2  8  3  1
>> tril(ones(3))
ans =
  1  0  0
  1  1  0
  1  1  1
>> triu(ones(5),-2)
ans =
  1  1  1  1  1
  1  1  1  1  1
  1  1  1  1  1
  0  1  1  1  1
  0  0  1  1  1

Octave také obsahuje funkce pro výrobu speciálních matic, jakými jsou například Hankelova, Hilbertova, Sylvesterova či Toeplitzova matice. Popis parametrů je v nápovědě.

Rozměry matice

Funkce size s parametrem nějaké matice vrací dvouprvkový vektor, ve kterém první hodnota odpovídá počtu řádků dané matice a druhá počtu sloupců:

>> size(ones(5))
ans =
  5  5

Funkce rows a columns vrací pouze odpovídající složku z dvouprvkového výsledku funkce size, tj. počet řádků, respektive počet sloupců z dané matice:

>> rows([1:5]')
ans = 5
>> columns(zeros(4,60))
ans = 60

Počet řádků a počet sloupců nějaké matice tedy lze do proměnných uložit dvěma následujícími ekvivalentními způsoby:

>> Matice=zeros(5,20);
>> [radky, sloupce]=size(Matice)
radky = 5
sloupce = 20
>> radky=rows(Matice), sloupce=columns(Matice)
radky = 5
sloupce = 20

Funkce length vrací větší z hodnot vrácených funkcí size, typicky se používá pro výpočet počtu prvků v nějakém vektoru, přičemž se nemusíme starat o to, zda je tento vektor řádkový či sloupcový:

>> length([1 2 3 8])
ans = 4

Operátor dvojtečka

Znak dvojtečka slouží k zhuštěnému zápisu řádkového vektoru obsahujícího nějakou aritmetickou posloupnost. Obecně v zápisu figurují tři čísla oddělená dvojtečkami. První z nich představuje počáteční člen posloupnosti, druhé velikost kroku a třetí poslední přípustný člen řady. Více to bude patrno z příkladů:

>> 1:1:6
ans =
  1  2  3  4  5  6

Posloupnost čísel od jedné do šesti s krokem jedna:

>> 1.5:2.5:7.9
ans =
  1.5000  4.0000  6.5000

Následující potenciální člen posloupnosti 6,5 + 2,5 = 9 již je číslo větší jak nejvyšší přípustný člen posloupnosti, tj. číslo 7,9, proto již v posloupnosti obsažen není. Všimněme si, že v zápisu samozřejmě lze pracovat s reálnými čísly, nejenom s celými.

>> 5:-1:-1
ans =
   5   4   3   2   1   0  -1
>> 0:8
ans =
  0  1  2  3  4  5  6  7  8

V případě, že není krok uveden - zápis sestává pouze ze dvou čísel oddělených jednou dvojtečkou - považuje se za krok hodnota 1. Zápis posloupnosti s dvojtečkovou notací se používá zejména při indexovaném přístupu k obsahu matic, lze tak snadno vybrat například druhý až jedenáctý řádek dané matice. Více viz následující odstavce.

Přístup k jednotlivým složkám vektoru

Nezřídka se může stát, že při výpočtu je potřeba pracovat pouze s určitými prvky nějakého vektoru či matice, nikoliv s celým obsahem proměnné najednou. V kulatých závorkách uvedených bezprostředně za názvem proměnné lze uvést index prvku, s kterým se má pracovat:

>> X=5:-1:-4
X =
   5   4   3   2   1   0  -1  -2  -3  -4
>> X(1)
ans = 5
>> X(4)
ans = 2
>> X(end)
ans = -4

Zadáním jednoho čísla se odkazujeme na pozici v daném vektoru. Pozice se číslují od jedničky, na poslední pozici se lze odvolat pomocí klíčového slůvka end. Jedním výběrem však pozic můžeme vybrat více - výsledkem je „podvektor“ složený z prvků vybraných z původního vektoru v uvedeném pořadí:

>> X(3:7)
ans =
   3   2   1   0  -1
>> X(end:-2:1)
ans =
  -4  -2   0   2   4
>> X([8,5,7,1])
ans =
  -2   1  -1   5
>> X([9,9,9,1,1])
ans =
  -3  -3  -3   5   5

Poslední uvedený příklad ukazuje, že není problémem vybrat prvek na zvolené pozici vícekrát - při budování výsledného vektoru se právě tolikrát a právě v takovém pořadí vybrané prvky objeví. Za povšimnutí stojí též fakt, že zadání více pozic je nutno zapsat jako vektor těchto pozic (tj. v hranatých závorkách), na úrovni kulatých závorek lze totiž u vektoru zadat pouze jeden parametr indexování.

Přístup k jednotlivým složkám matice

Přístup k prvkům matice analogicky odpovídá přístupu ke složkám vektoru s tím rozdílem, že je nutno zadat indexy dva - řádkový a sloupcový oddělené čárkou (no, není to tak úplně pravda, ale to se ukáže až později):

>> M=fix(rand(5)*21)-10;

% Vyber prvek z druhého řádku a čtvrtého sloupce
>> M(2,4)
ans = -9

% Vyber první-až-třetí řádek průnik třetí-až-pátý sloupec
>> M(1:3,3:5)
ans =
    0    7   10
   10   -9   -5
   -2   -8   -1

% Vyber postupně pátý, třetí a první řádek skrze všechny sloupce
>> M([5,3,1],:)
ans =
   -5    5   -1   -5   -2
    5   -7   -2   -8   -1
   -8   -2    0    7   10

V případě, kdy chce uživatel vybrat všechny řádky respektive všechny sloupce, stačí na místě příslušného indexu uvést pouze znak „:“ namísto ekvivalentního 1:end.

Výběr určitých prvků z matice lze činit také proto, abychom tyto prvky nahradili jinými hodnotami. Oblast výběru svými rozměry musí vždy odpovídat rozměrům vkládané matice:

>> M(1,2)=-4
>> M(1,:)=M(3,:)
>> M([2,4],[2,4])=ones(2)
>> M(:,2)=[]

První příkaz nahradil prvek v prvním řádku a druhém sloupci hodnotou -4; druhý zkopíroval třetí řádek na první řádek; třetí nahradil prvky v matici ve druhém a čtvrtém řádku i sloupci jedničkami; poslední pak smazal druhý sloupec - mazání se provádí vložením prázdné matice (viz minulý díl). Aby byla zachována konzistence matice, je nutno mazat vždy celé řádky či sloupce.

Příště

Příští díl se bude věnovat relačním a logickým operátorům v Octave.

Seriál Octave (dílů: 16)

První díl: Octave - 1 (je to kalkulačka), poslední díl: Octave - 16 (a co dál?).
Předchozí díl: Octave - 2 (počítání s maticemi)
Následující díl: Octave - 4 (je to pravda?)

Související články

Octave - 1 (je to kalkulačka)
Octave - 2 (počítání s maticemi)
Octave - 4 (je to pravda?)
Octave - 5 (práce s řetězci)
Octave - 6 (práce se soubory)
Octave - 7 (vlastní skripty a funkce)
Octave - 8 (větvení programu)
Octave - 9 (cykly)
Octave - 10 (zbylé řídicí struktury)
Octave - 11 (kreslíme grafy)
Octave - 12 (měřítko os a speciální grafy)
Octave - 13 (dokončení grafiky)
Octave - 14 (finance a statistika)
Octave - 15 (špetka matematiky)
Octave - 16 (a co dál?)
Vektorový elegán Ipe
Recenze: Kniha kódů a šifer
Awk & sed: Příručka pro dávkové zpracování textu
SETI@home
Jak se píše procesor
GnuCash - domácí účetnictví na úrovni
Použití gnuplot pro tvorbu grafů v PHP
Hra s písmenky - wxMaxima

Odkazy a zdroje

Octave

Další články z této rubriky

LLVM a Clang – více než dobrá náhrada za GCC
Ze 4 s na 0,9 s – programovací jazyk Vala v praxi
Reverzujeme ovladače pro USB HID zařízení
Linux: systémové volání splice()
Programování v jazyce Vala - základní prvky jazyka

Diskuse k tomuto článku

1.2.2006 10:45 herhor
Rozbalit Rozbalit vše Re: Octave - 3 (přístup k jednotlivým položkám matice)
Odpovědět | Sbalit | Link | Blokovat | Admin
Já jsem tedy jednoznačně proti tomu, aby tady vycházely tutoriály pro idioty. Uvod do Octave pro nezasvěcené má vypadat nějak takhle http://www.root.cz/clanky/octave-programovaci-jazyk-pro-neprogramatory/. Pro koho je určené tohle vážně nechápu.
1.2.2006 11:04 Robert Krátký | skóre: 94 | blog: Robertův bloček
Rozbalit Rozbalit vše Re: Octave - 3 (přístup k jednotlivým položkám matice)
Každý někdy začínal. Připadá-li ti článek příliš podrobný nebo jednoduchý, nelze poradit nic jiného, než abys ho nečetl. Nikdo tě nenutí. Buď ale tolerantní a ponech ho nám ostatním.
1.2.2006 12:21 coccyx
Rozbalit Rozbalit vše Re: Octave - 3 (přístup k jednotlivým položkám matice)
mne sa tento serial celkom paci a urcite si nemyslim ze dobry clanok by mal byt suhrn linkov na manual programu. A celkom by som bol rad keby po dokonceni serialu vysla aj nejaka kompaktna PDF verzia.
1.2.2006 12:42 Robert Krátký | skóre: 94 | blog: Robertův bloček
Rozbalit Rozbalit vše Re: Octave - 3 (přístup k jednotlivým položkám matice)
Po dokončení bude celý seriál v jednom z vydání PDF Abíčka.
1.2.2006 12:42 jam001 | skóre: 19
Rozbalit Rozbalit vše Re: Octave - 3 (přístup k jednotlivým položkám matice)
Nieco taketo nestaci? http://www.octave.org/doc/index.html
menphis avatar 1.2.2006 12:45 menphis | skóre: 22 | blog: menphis_blog
Rozbalit Rozbalit vše Re: Octave - 3 (přístup k jednotlivým položkám matice)
Jj, taky si myslim,ze by clanek mohl byt trochu odborneji pojat. Na 3. dil je prace s prvky hodne malo!
1.2.2006 12:25 coccyx
Rozbalit Rozbalit vše dlhy vypis
Odpovědět | Sbalit | Link | Blokovat | Admin
by som sa chcel spytat ako sa da vypnut funkcia, ktora umoznuje prezeranienie vypisu dlhych vysledkov, mi to pripada ako prikaz more ale ked mam program v skripte mi vadi ze program zastavuje na tomto vypise.
1.2.2006 13:16 jam001 | skóre: 19
Rozbalit Rozbalit vše Re: dlhy vypis
Bohuzial nerozumiem tvojej otazke (vlastne tam ani ziadna otazka nie je).

Nepomoze ti ';' na konci kazdeho prikazu? To sposobi, ze vysledok prikazu nie je vypisany.
1.2.2006 14:26 coccyx
Rozbalit Rozbalit vše Re: dlhy vypis
no praveze ja som chcel ten vysledok vidiet, len aby sa to nezastavovalo na tom vypise, napriklad v koctave si mozem vyskrolovat vsetky vysledky ...

riesenie: page_screen_output=0

-- Built-in Variable: page_screen_output If the value of `page_screen_output' is nonzero, all output intended for the screen that is longer than one page is sent through a pager. This allows you to view one screenful at a time. Some pagers (such as `less'--see *Note Installation::) are also capable of moving backward on the output. The default value is 1.
1.2.2006 22:23 GeBu | skóre: 27 | blog: zápisky
Rozbalit Rozbalit vše Re: Octave - 3 (přístup k jednotlivým položkám matice)
Odpovědět | Sbalit | Link | Blokovat | Admin
Nevíte někdo jestli neexistuje manuál v češtině?

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.