Portál AbcLinuxu, 6. května 2024 03:59

Octave - 4 (je to pravda?)

14. 2. 2006 | Jiří Poláček
Články - Octave - 4 (je to pravda?)  

Relační a logické operátory, jednoduché testovací funkce a hledání prvků v maticích.

Relační operátory

Vyhodnocením nějakého výrazu v Octave může být také odpověď ano/ne, pravda či nepravda. Typicky lze tohoto dosáhnout srovnáním dvou čísel pomocí relačních operátorů:

>> 4 > 2
ans = 1
>> 10 <= 1
ans = 0

Kladnou odpověď, tedy hodnotu pravda, Octave reprezentuje jako číslo 1, zápornou odpověď neboli nepravdu, pak jako číslo 0. Uveďme si přehled dostupným relačních operátorů v Octave:

a == b a je rovno b
a ~= b
a != b
a <> b
a je různé od b
a < b a je menší jak b
a > b a je větší jak b
a <= b a je menší rovno b
a >=b a je větší rovno b

Jak vidno, pro zapsání nerovnosti máme k dispozici hned tři různé možnosti. Na rozdíl od Matlabu nejsou v Octave k  dispozici ekvivalentní srovnávací funkce jako eq, lt, ge apod. (tyto funkce nicméně mohou být v Octave dostupné po instalaci rozšíření, které se snaží o větší kompatibilitu mezi těmito systémy).

Srovnávat lze také celé matice, pokud jsou rozměrově stejné. Výsledkem je stejně velká matice odpovědí - srovnání probíhá prvek po prvku:

>> A=[1 2; 3 4]; B=[1 1; 4 4]; A<B
ans =
  0  0
  1  0

Výsledek lze číst tak, že pouze ve druhém řádku a prvním sloupci je hodnota v matici A ostře menší než v matici B.

Logické operátory

S hodnotami pravda a nepravda lze také pracovat při logických operacích. V těchto případech je číslo nula vždy chápáno jako nepravda a jakékoliv jiné, tj. nenulové číslo jako pravda. K dispozici pak máme logický součin, logický součet a negaci:

>> 0 & 1
ans = 0
>> 0 | 1
ans = 1
>> ~6,!(!6)
ans = 0
ans = 1

Pro negaci lze použít symbol vlnovka (tilda) nebo vykřičník. Souhrnně tedy:

x & y x a zároveň y
x | y x nebo y
~x
!x
negace x

Ani tentokrát nejsou v Octave po vzoru Matlabu ekvivalentní funkce and, or a not. Existuje však funkce xor pro exkluzivní nebo:

>> xor(1,1)
ans = 0

K dispozici jsou též operátory pro neúplné vyhodnocování logického součinu a součtu, kdy vyhodnocování skončí v okamžiku, kdy je již znám výsledek na základě části výrazu. Jedná se vlastně o zdvojené symboly pro tyto operace:

>> 0 && (4 < 5)
ans = 0
>> 1 || (4 < 5)
ans = 1

Ani v jednom z těchto příkladů se nevyhodnocoval výraz 4 < 5, neboť výsledek celého výrazu je jasný již z první části.

Konečně stejně jako u relačních operátorů lze logickými operátory spojovat celé matice, pokud mají stejné rozměry:

>> A=[1;1;0;0]; B=[1;0;1;0]; C=[A, B, A&B, A|B, xor(A,B)]
C =
  1  1  1  1  0
  1  0  0  1  1
  0  1  0  1  1
  0  0  0  0  0

Dodejme ještě, že v Octave existují dvě konstanty true a false (s hodnotami 1 a 0), s kterými lze v logických výrazech pracovat.

Jednoduché testovací funkce

Octave obsahuje celou řadu funkcí (s jménem obvykle začínajícím na is), které testují, zda objekt vyhovuje nějakým podmínkám. V prvé řadě sem patří testy na datový typ - isnan, isinf, isstr, finite - dotazy, zda daný objekt je NaN, nekonečno, řetězec či konečné číslo. Je-li testovacím objektem matice, vrací se stejněrozměrná matice výsledků - odpovědí pravd a nepravd v podobě jedniček a nul:

>> M=[27, NaN, -Inf];
>> isnan(M)
ans =
  0  1  0
>> isinf(M)
ans =
  0  0  1
>> finite(M)
ans =
  1  0  0
>> isstr("Ahoj")
ans = 1

Funkce isstr testuje, zda daný objekt je řetězcem - o řetězcích bude podrobné pojednání někdy příště.

Další řada funkcí testuje numerické objekty - isnumeric, isreal, iscomplex, ismatrix, isvector, isscalar - ptáme se, je-li objekt číslo, reálné číslo, komplexní číslo, matice, vektor, skalár:

>> isnumeric(Inf)
ans = 1
>> isreal(2.5+6i)
ans = 0
>> iscomplex(2.5+6i)
ans = 1
>> iscomplex(2.5)
ans = 0
>> ismatrix([])
ans = 0
>> isvector([1 2; 3 4])
ans = 0
>> isscalar([1 1])
ans = 0

Mezi dalšími testovacími funkcemi je vhodné zmínit se zejména o:

Příklady:

>> issquare(ones(5))
ans = 5
>> isbool(5 >= 0 & xor(1,0))
ans = 1
>> isbool(1)
ans = 0
>> isempty([])
ans = 1
>> is_duplicate_entry([1 2 3 1 1 3 3 1])
ans = 5

Poslední příklad vyšel roven pěti, protože kromě jedničky na prvním místě vstupního vektoru zde jsou ještě 3 další duplicity jedniček a k trojce uvedené na třetím místě dále figurují další 2 duplicity: 3 + 2 = 5. Výše uvedený výčet jednoduchých testovacích funkcí není zdaleka úplný, o některých ještě bude řeč dále, ostatní lze nalézt v nápovědě.

Hledání prvků

Hodnoty pravda a nepravda také vrací funkce any a all. První jmenovaná se ptá, zda-li je ve zkoumaném vektoru alespoň jeden prvek nenulový, druhá pak, zda-li jsou všechny prvku ve vektoru nenulové:

>> V=[0 1 2 3]; W=[1 2 3 4]; X=[0 0 0 0];
>> any(V), any(W), any(X)
ans = 1
ans = 1
ans = 0
>> all(V), all(W), all(X)
ans = 0
ans = 1
ans = 0

Pokud tyto funkce aplikujeme na matici, jako výsledek získáme vektor odpovědí - ke každému sloupci matice jednu:

>> A=[0 1 0; 1 2 0]
A =
  0  1  0
  1  2  0
>> any(A),all(A)
ans =
  1  1  0
ans =
  0  1  0

Kde je v odpovědi jednička, tak v takovém sloupci v pořadí daná podmínka platí. Chceme-li získat jedinou odpověď pro celou matici, můžeme funkce aplikovat vícekrát. Dotaz

>> any(any(A))
ans = 1

zjistí, zda v celé matici je alespoň jedno číslo nenulové; kombinací funkcí

>> all(any(A))
ans = 0

zase zjistíme, zda všechny sloupce matice obsahují alespoň jedno nenulové číslo apod.

Zatímco funkce any a all dávaly odpovědi ano a ne, s pomocí funkce find lze najít pozice prvků, které nějakou podmínku splňují. Přesně definováno funkce find vrací sloupcový vektor pozic nenulových prvků v matici:

>> find(A)
ans =
  2
  3
  4

V takovémto jednoduchém případě se pozice počítají od jedničky po sloupcích směrem od shora dolů, aktuální pozice tedy odpovídá přepočtu řádek + počet řádků × (sloupec -1):

A =          %  Pozice v A =
  0  1  0    %             1  3  5
  1  2  0    %             2  4  6

Funkci find lze „donutit“, aby pozice prvků vracela jako dva vektory, kdy v jednom budou indexy řádků a ve druhém indexy sloupců; správné souřadnice pak získáme, vezmeme-li dvojice čísel ze stejných pozic v těchto vektorech:

>> [radky, sloupce]=find(A)
radky =
  2
  1
  2
sloupce =
  1
  2
  2

Pro lepší přehlednost pak můžeme tyto sloupcové vektory vypsat vedle sebe v jedné matici:

>> [radky, sloupce]
ans =
  2  1  % čteno po řádcích vidíme souřadnice
  1  2
  2  2

Výsledek nyní čteme tak, že nenulové prvky jsou v matici A ve druhém řádku a prvním sloupci, v prvním řádku a druhém sloupci a také v druhém řádku a druhém sloupci.

Nakonec si ukažme, jak se se funkce find obvykle používá - pro výpis pozic prvků, které splňují nějakou podmínku:

>> find(A==0)
ans =
  1
  5
  6

Na vypsaných pozicích je v matici A číslo nula.

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 - 3 (přístup k jednotlivým položkám matice)
Následující díl: Octave - 5 (práce s řetězci)

Související články

Octave - 1 (je to kalkulačka)
Octave - 2 (počítání s maticemi)
Octave - 3 (přístup k jednotlivým položkám matice)
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

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