Table of Contents
Implicitní expanze
Implicitní expanze je kontroverzní fičura, která přibyla do MATLABu v release 2016b. Někteří nad ní jásají a vítají ji, jiní jsou smutní a pár lidí si odinstalovalo MATLAB a už ho nechtějí vidět. Pojďme se tedy podívat o co jde:
MATLAB a maticové operace
MATLAB od začátku byl a stále je postaven na maticových operacích. Přitom provádění těchto maticových operací vždy víceméně vycházelo ze zvyklostí a zápisu matematiky. Pokud tedy vytvoříme matici a vektor následujícím způsobem
A = [1,2; 3,4] b = [5;6] c = A*b
dostaneme výsledek
c = 17 39
Pokud jsme se pokusili (ve verzích před 2016b) provést nějakou maticovou operaci, která odporuje pravidlům lineární algebry, např. pokus sečíst A + b
C = A + b
dostali jsme error
.
Operace s maticí/vektorem a konstantou
Od nepaměti1) existovala jediná výjimka a tou je násobení/dělení matice/vektoru konstantou nebo přičtení/odečtení konstanty:
D = [1,2; 3,4] + 5 F = [1,2; 3,4]*5
V obou případech jde o platné operace (vyzkoušejte si sami, jaký dostaneme výsledek, ale skoro bych řekl, že je pro každého dosti očekávaný a intuitivní).
Temnota přichází...
Od verze 2016b se situace mění a sečtení A
a b
funguje. Jak? Kód
A = [1,2; 3,4] b = [5;6] C = A + b
bude fungovat a výsledkem je:
C = 6 7 9 10
Proč? Protože implicitní expanze. Když se pozorně na tento příklad podíváme, asi nám dojde co se zde stalo. Přirozená otázka je: proč bylo toto zavedeno?
Odpověď je: kvůli pohodlnějšímu zápisu některých operací. Jednoduchý příklad je tento:
A = [1,2; 3,4] B = A - min(A)
Zkuste si nejprve tipnout jaký je výsledek (ano, je nutno vědět, jak funguje funkce min
).
A pak se podívejte pro správnou odpověď do poznámky2)
Ve verzích před 2016b bylo nutné pro dosažení stejného výsledku napsat:
B = A - repmat(min(A),2,1)
nebo
B = bsxfun(@minus, A, min(A))
kde ''bsxfun'' je funkce speciálně zavedená ve verzi 2017a právě pro implicitní expanzi.
Příklady k procvičení a demonstraci síly temnot
Tipněte si výsledky těchto příkladů:
A = [1;2] + [3;4] B = [1;2] + [3,4] C = [1,2] + [3;4] D = [1,2] + [3,4]
Postoj mechatronikův
Z hlediska našich potřeb a aplikací je implicitní expanze - jak je asi zřejmo i z okolního textu a nadpisů sekcí - nepříjemná.
Při programování maticových operací se každý a často splete a zamění rozměry matic. Dosti (i zkušených) MATLABistů mi jistě potvrdí, že často pracujeme stylem “pokus-omyl” a tak ladíme náš kód. Za krásných starých dobrých časů platilo, že hned v řádku, kde byla použita chybná maticová operace, jsme to zjistili. Nyní nám tato chybička může prosakovat někam zcela jinam, musíme být ostražití a opatrní, případně kontrolovat dimenzi matic/vektorů - což jde ale zcela proti filosofii MATLABu jako nástroje pro techniky/vědce a nikoli programátory.
A samozřejmě, o to více je tato vlastnost nepříjemná pro studenty, kteří se MATLAB učí.