====== 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ěti((Opravdu nevím zda od první verze, ale předpokládám, že ano.)) 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ámky((Správná odpověď: B = 0 0 2 2 )) 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 [[https://www.mathworks.com/help/matlab/ref/bsxfun.html|''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čí. ===== Další kritika tototo báječného zjednodušení, hereze i pokusy o vysvětlení ===== - https://undocumentedmatlab.com/blog/afterthoughts-on-implicit-expansion - https://www.mathworks.com/matlabcentral/answers/383533-how-do-i-avoid-getting-fooled-by-implicit-expansion - https://nickhigham.wordpress.com/2016/09/20/implicit-expansion-matlab-r2016b/ - https://www.mathworks.com/matlabcentral/answers/318495-deactivation-switch-for-implicit-expansion - https://stackoverflow.com/questions/49535504/disable-matlabs-implicit-expansion - http://hogwarts.ucsd.edu/~pkrysl/no-Matlab-support.html - https://blogs.mathworks.com/loren/2016/10/24/matlab-arithmetic-expands-in-r2016b/ - https://blogs.mathworks.com/loren/2016/11/10/more_thoughts_about_implicit_expansion/