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čí.

Další kritika tototo báječného zjednodušení, hereze i pokusy o vysvětlení

1)
Opravdu nevím zda od první verze, ale předpokládám, že ano.
2)
Správná odpověď:
B = 
   0     0
   2     2