Portál AbcLinuxu, 2. května 2025 07:47
Relační a logické operátory, jednoduché testovací funkce a hledání prvků v maticích.
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 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.
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 | 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.
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ě.
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.
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.