Maticové vzorce.

blog.png V diskusním fóru se stále častěji objevují řešení problémů pomocí maticových vzorců, které jsou poměrně velice dobré, ale mají také svá úskalí a některé nevýhody.  

   Maticové vzorce jsou do určité míry nestandardní nástroje, které lze zadávat pomocí průvodce funkcí. Existuje také možnost z "obyčejného" vzorce udělat vzorec maticový pomocí Ctrl+Shift+Enter.

   Jenomže když dává "normální" vzorec správný výsledek tak není třeba maticové verze. Když stavíme maticový vzorec, nejdříve vytvoříme normální, který odporuje syntaxi běžného vzorce. Následně ho vybavíme "složenými závorkami" pomocí výše uvedeného trojhmatu, nebo zaškrtnutím příslušného okénka v průvodci funkcí. Takže vlastně už jen zbývá počkat jak a zda vzorec funguje. Ne vždy se zadaří. Spíš naopak. Odlišná syntaxe maticových vzorců odradí nejednoho uživatele.


   Já osobně jsem možnosti využití kdysi zkoumal a zavrhl z několika důvodů. To, že to byla chyba jsem pochopil až z diskusních příspěvků fóra od uživatele lp. Zejména jde o příspěvek http://forum.openoffice.cz/viewtopic.php?id=2863. Lze nalézt také jiné návody (dříve uvedený je diskusním příspěvkem ale má charakter obecného návodu). Například http://wiki.openoffice.org/wiki/Documentation/How_Tos/Using_Arrays#Array_formula_calculations

   Zádrhely jsou právě v pochopení logiky a syntaxe maticových vzorců. Jak napovídá druhý odkaz, je to spojené s logikou polí (arrays). Správný výraz je "matrix" (matice), což souvisí více s matematickými pojmy množin a logikou. Jedná se například o logiku operací sjednocení, průniku, rozdílu, doplňku, transpozice, inverzní matice a další. Teprve potom je pochopitelné, že operátory (operace) dělají něco jiného, nežli jsme zvyklí, a co od vzorce běžně očekáváme. Například operátor součinu * se chová jako logické AND. Ale ne vždy v rámci jediného vzorce, jen když se jedná o součin adres (tedy polí). 

   Druhá věc, která mne k maticovým vzorcům přivedla bylo nalezení sešitu Excelu, který obsahoval mimo jiné pro mne téměř neuvěřitelnou věc. Vzorce pro vytvoření kombinací, variací a permutací včetně verzí s opakováním. Tedy ne výpočet kolik je kombinací "COMB()" a podobně, ale funkce na vygenerování všech tvarů k-tic. Světe drž se jak jinak, nežli pomocí matic. Tedy matice "krmí" pomocí speciálně postavených funkcí. Jednotlivá k-tice je v jedné buňce a jednotlivá čísla jsou oddělena čárkou. To se dá samozřejmě zpětně načíst jako CSV, nebo dodatečně vzorci rozložit do jednotlivých buněk.

   Problematiku generování "všech tvarů" kombinatorických množin studuji už opravdu hodně dlouho. Byla příčinou proč jsem si kdysi pořídil kancelářský balík Lotus. Od té doby uplynulo hodně vody a já dnes umím postavit třeba kombinace pomocí několika různých algoritmů a nejen v Basicu, ale i například v JavaScriptu, který jsem se kvůli tomu naučil. Dělám to proto, že pro různé účely vyhovují různé algoritmy. Nestačí jen vygenerovat naráz miliony tipů.

   Mám proto vytvořené také verze pro tabulkové procesory, které generují do několika buňek jen pomocí nativních vzorců (funkcí) vestavěných do tabulkových procesorů. Není potřeba podpory nějaké specializované knihovny OOBasicu, VB a podobně. Je - li potřeba generovat šestimístné kombinace (například Sportka), má každé číslo šestice svou buňku. Vzorce se kopírují podle potřeby, a snadno pokračujeme na jiném listu, nebo sešitě. Byly to právě potřeby "přerušovaného generování", které se opírá o zpětné volání předchozího řádku (tipu). Výstižně, ale velmi nesprávně by to mohlo být označeno jako "rekurzivita" algoritmu, kterou drtivá většina zveřejněných algoritmů nemá. Když se spustí - tak se "vysypou jako kýbl s uhlím", tedy nelze je přerušit, nebo alespoň ne bez programovaného dodatku (vstupu) pokud to vůbec lze udělat. Je jasné, že pak script značně přibere na váze se všemi důsledky.

   Už kdysi dávno jsem zavrhl takové způsoby, jaké jsem našel v uvedeném sešitu Excel. Matice se generuje naráz a jen těžko ji někdo "zlomí" do více sloupců, pokud by chtěl generovat více, nežli obsahuje list řádků. Jedna buňka s obsahem více čísel vyžaduje úpravy tak aby se dalo pracovat s čísly. Je to ale zatím jediný odkaz na vytvoření kombinatorických těles (množin). Prošel jsem už hezkou řádku odkazů, ale mimo tohoto jsem nic nenašel. Má to sice nevýhody, ale bylo to určeno jako součást pro výuku práce a možností v Excelu - něco jako šablona pro makra. K takovým účelům ukázka bohatě postačuje a stačí přiloženou knihovnu upravovat dle potřeb.

   Já jsem do té doby své vzorce buď implementoval do psaných maker, nebo jsem vzorce zautomatizoval pomocí maker nahrávaných. Dík maticovým vzorcům se mi dostalo poučení, že lze vytvořit v jediné buňce například funkci pro kombinace bez opakování typu =COMBBODYNOREP(k;n). Funkce se rozvine sama do vedlejších políček a může buď generativně, nebo rekurzivně a možná i s přerušením, nebo zalomením do jiného sloupce vypsat vše. Což by byl asi přínos pro uživatele, kteří makrům neholdují. Budu se Vážně zabývat vytvořením takového rozšíření pro Calc.


   Maticové vzorce skutečně skýtají mnoho výhod. Jedná se zejména o to, že lze zadávat porovnávání více polí naráz, což udělat klasickým vzorce většinou lze ale za cenu mnoha složitostí - velkého počtu vzorců, nebo krkolomné konstrukce. Maticové výpočty jsou velice efektivní, protože jejich zpracování probíhá na nižšší programové úrovni. Ale to je tak zhruba vše. Nevýhody jsem popisoval dříve, ale je zřejmé, že použití není určeno běžnému průměrnému uživateli. Zbývá pak jediné - obrátit se na fórum a požádat o vyhotovení vzorce "na míru". Zde tedy funguje prakticky jediný protagonista, kterému za to velice děkuji.


   Proč to ale píšu. Přesně tohle téma by bylo zralé na šablonu. Tedy spíš do "návodů", které by bývaly mohly být na Wiki, které ovšem umřelo dík penězům. Postup jmenovaného uživatele "lp." je poměrně ojedinělý, ale postupně zanikne v množství nových příspěvků. Proto doufám, že odkaz "maticové vzorce" půjde dohledat v textech článků. Zde by mělo být dík odkazům snadnější se orientovat.

Tedy neškodilo by pár vzorových šablon pro různé účely a nebo také "karta rychlé nápovědy", kterou by si to jistě zasloužilo.

(Jako ve škole) Průměr: 4,60 | Hodnotilo: 10
 

Komentáře

user avatar Standa
Odpovědět
Maticové vzorce.
18. 12. 2015, 11:31:02
Zdravím Tě Petře
Předem přijmi moji omluvu, že Ti píši do tohoto blogu, ale nemám Tvoji e. adresu. Máš-li zájem, tak Tě prosím o její zaslání. V případě že se neozveš, tak Ti tímto přeji krásné prožití vánočních svátků, veselý Silvestr a šťastný nový rok.
Ještě jednou se omlouvám
Stanislav Voldřich

Přidat názor

 

Nejsou podporovány žádné značky, komentáře jsou jen čistě textové. Více o diskuzích najdete v nápovědě. Diskuzi můžete sledovat pomocí RSS kanálu.

 
Petr Neudek

Petr Neudek

 
 
 
woo jaw demo hz