====== 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/