Archive for Listopad, 2009

Java – Gaussova Eliminační Metoda 5

Funkční applet: ZDE.

EDIT: Problém s lineárně závislými řádky :-).

Následující kód, který jsem dnes uvařil:-), převádí pomocí GEM matice libovolného typu do horního trojúhelníkového tvaru. Je optimalizovaný i pro mrchy matice, které v sobě skrývají n lineárně závislých řádků nebo dokonce sloupců. Je částečně optimalizovaný i paměťově… během výpočtu efektivně krátí nově vzniklé řádky matice (to je možno vypnout pomocí opt_through).

po předvedení kódu (kde záměrně chybí ona krátící metoda) ho vysvětlím a potom ukážu pár příkladů (přímo ze skript pana Olšáka).

public void GEM(boolean opt_through)     {         int i, j, l;         double c, d, gc;         boolean cad = false;         int m_var_r = 0;         int m_var_s = -1;         if(opt_through)         {             optimize();         }         for(m_var_r = 0; m_var_r < _m - 1; m_var_r++)         {             m_var_s++;             cad = false;             for(l = m_var_r; l < _m; l++)             {                 if((_matrix[m_var_r][m_var_s] != 0))                 {                     break;                 }                 if(l == _m - 1)                 {                     swapRows(m_var_r, _m - 1);                     cad = true;                 }                 swapRows(m_var_r, _m - l);             }             if(cad)             {                 m_var_r--;                 continue;             }             c = _matrix[m_var_r][m_var_s];             for(i = m_var_r; i < _m - 1; i++)             {                 d = _matrix[i + 1][m_var_s];                 for(j = m_var_r; j < _n; j++)                 {                     _matrix[i + 1][j] = (c * _  _matrix[i + 1][j])                             - (_matrix[m_var_r][j] * d);                 }                 if(opt_through)                 {                     gc = gcdv(_matrix[i + 1], _  m_var_r, _n - 1);                     for(j = m_var_r; j < _n && _  gc != 0; j++)                     {                         _matrix[i + 1][j] = _  _matrix[i + 1][j]                                 / Math.abs(gc);                     }                 }             }         }     }

Znáte původní objektovou konvenci Microsoftu? Jestli ano, určitě jste poznali, že je kód vytržený z nějaké třídy, protože soukromé vnitřní proměnné bylo kdysi dohodnuto označovat underscorem v prvním znaku identifikátoru – „private: int _example=0;“

_matrix je tedy ona matice samotná
_m je počet řádků
_n je počet sloupců
m_var_r a m_var_s jsou proměnné, které identifikují aktuální levý horní roh matice

Na začátku se zkrátí řádky (užitečné pro matici náhodných čísel typu 10 10, kterou někdo z legrace vynásobil číslem 678). Nabíhá hlavní loop, který posouvá horní roh, následován několika smyčkami a podmínkami, které kontrolují, zda-li se vyskytuje na aktuální pozici našeho primárního řádku (ten, který se „opisuje“) nula. Pakliže ano, prohodí s posledním a zknotroluje. Takto postupuje vystřídaje všechny řádky a pokud nenalezne žádné nenulové číslo, dekrementuje řádkový čítač (protože se ve foru bežně inkementuje a my chceme zůstat na stejné řádce, abychom se mohli posunout doprava) a pokračuje zpět na hlavičku prvního řádkového foru, potom se inkrementuje sloupcový čítač a opět se kontrolují nuly ve sloupci.

Pokud nalezne nenulové číslo, program přejde do druhé části, kde se aktuální sloupec nuluje (klasicky alfa bé mínus beta á), přičemž každý nově vzniklý řádek zkouší zkrátit (pokud to má zadáno oním boolem v parametrech). No a to je v podstatě všechno. Kód spadne pouze pro pro matice typu (m, 1) nebo (1, n), neboť ty se nedají eliminovat.

Teď koukám, na co jsem zapomněl… zapomněl jsem na proměnnou cad. Cad protože column already done a slouží jako dablbrejk :-).

Je pravděpodobné, že jsou tam zbytečné nebo dále optimalizovatelné kroky, ale vem to čert. Funguje to, a celkem rychle. Matici 100 na 100 s čísly od 0 do 10 zeliminatí za pár vteřin… akorát to zarovnání je potom takové… no… zřete :-)…

/ 7.0 8.0 10.0 2.0 6.0 3.0 9.0 3.0 9.0 1.0 | 5.0 5.0 1.0 10.0 9.0 9.0 5.0 6.0 7.0 0.0 | 9.0 10.0 1.0 6.0 10.0 3.0 9.0 5.0 2.0 8.0 | 5.0 1.0 3.0 2.0 1.0 6.0 1.0 3.0 2.0 3.0 | 5.0 10.0 2.0 9.0 10.0 1.0 3.0 5.0 5.0 2.0 | 8.0 8.0 3.0 8.0 2.0 10.0 1.0 10.0 4.0 9.0 | 9.0 8.0 4.0 8.0 9.0 2.0 0.0 5.0 3.0 3.0 | 9.0 4.0 3.0 3.0 6.0 9.0 2.0 5.0 1.0 3.0 | 1.0 2.0 8.0 10.0 0.0 5.0 6.0 7.0 2.0 5.0 \ 0.0 0.0 1.0 6.0 5.0 7.0 4.0 2.0 8.0 10.0 / 7.0 8.0 10.0 2.0 6.0 3.0 9.0 3.0 9.0 1.0 | 0.0 -5.0 -43.0 60.0 33.0 48.0 -10.0 27.0 4.0 -5.0 | 0.0 0.0 47.0 0.0 -2.0 18.0 10.0 2.0 49.0 -35.0 | 0.0 0.0 0.0 2632.0 1544.0 2601.0 176.0 1229.0 2169.0 ... | 0.0 0.0 0.0 0.0 6312.0 5843.0 18448.0 -625.0 7459.0 ... | 0.0 0.0 0.0 0.0 0.0 -15857.0 -24598.0 -5237.0 -10999... | 0.0 0.0 0.0 0.0 0.0 0.0 22017.0 4380.0 9081.0 -15604... | 0.0 0.0 0.0 0.0 0.0 0.0 0.0 26961.0 8682.0 -98101.0 | 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -10579.0 11283.0 \ 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -1.0

Nyní ještě slíbené příklady. Oba dva lze najít ve skriptech pana Olšáka. Zde jsou ale rozepsané podrobně tak, jak je můj program počítal:

/ 2.0 -2.0 1.0 0.0 3.0 4.0 | -4.0 4.0 -1.0 1.0 -7.0 -11.0 | 4.0 -4.0 5.0 1.0 7.0 -3.0 \ -6.0 6.0 -4.0 1.0 -12.0 -7.0 / 2.0 -2.0 1.0 0.0 3.0 4.0 | 0.0 0.0 2.0 2.0 -2.0 -6.0 | 4.0 -4.0 5.0 1.0 7.0 -3.0 \ -6.0 6.0 -4.0 1.0 -12.0 -7.0 / 2.0 -2.0 1.0 0.0 3.0 4.0 | 0.0 0.0 1.0 1.0 -1.0 -3.0 | 0.0 0.0 6.0 2.0 2.0 -22.0 \ -6.0 6.0 -4.0 1.0 -12.0 -7.0 / 2.0 -2.0 1.0 0.0 3.0 4.0 | 0.0 0.0 1.0 1.0 -1.0 -3.0 | 0.0 0.0 3.0 1.0 1.0 -11.0 \ 0.0 0.0 -2.0 2.0 -6.0 10.0 / 2.0 -2.0 1.0 0.0 3.0 4.0 | 0.0 0.0 1.0 1.0 -1.0 -3.0 | 0.0 0.0 0.0 2.0 -4.0 2.0 \ 0.0 0.0 3.0 1.0 1.0 -11.0 / 2.0 -2.0 1.0 0.0 3.0 4.0 | 0.0 0.0 1.0 1.0 -1.0 -3.0 | 0.0 0.0 0.0 1.0 -2.0 1.0 \ 0.0 0.0 0.0 -2.0 4.0 -2.0 / 2.0 -2.0 1.0 0.0 3.0 4.0 | 0.0 0.0 1.0 1.0 -1.0 -3.0 | 0.0 0.0 0.0 1.0 -2.0 1.0 \ 0.0 0.0 0.0 0.0 0.0 0.0 / 2.0 -2.0 1.0 0.0 3.0 4.0 | 0.0 0.0 1.0 1.0 -1.0 -3.0 | 0.0 0.0 0.0 1.0 -2.0 1.0 \ 0.0 0.0 0.0 0.0 0.0 0.0

A ještě jeden.

/ 1.0 2.0 3.0 1.0 1.0 | 2.0 4.0 7.0 7.0 4.0 | 1.0 0.0 2.0 0.0 -2.0 \ 3.0 7.0 10.0 6.0 7.0 / 1.0 2.0 3.0 1.0 1.0 | 0.0 0.0 1.0 5.0 2.0 | 1.0 0.0 2.0 0.0 -2.0 \ 3.0 7.0 10.0 6.0 7.0 / 1.0 2.0 3.0 1.0 1.0 | 0.0 0.0 1.0 5.0 2.0 | 0.0 -2.0 -1.0 -1.0 -3.0 \ 3.0 7.0 10.0 6.0 7.0 / 1.0 2.0 3.0 1.0 1.0 | 0.0 0.0 1.0 5.0 2.0 | 0.0 -2.0 -1.0 -1.0 -3.0 \ 0.0 1.0 1.0 3.0 4.0 / 1.0 2.0 3.0 1.0 1.0 | 0.0 1.0 1.0 3.0 4.0 | 0.0 0.0 1.0 5.0 5.0 \ 0.0 0.0 1.0 5.0 2.0 / 1.0 2.0 3.0 1.0 1.0 | 0.0 1.0 1.0 3.0 4.0 | 0.0 0.0 1.0 5.0 5.0 \ 0.0 0.0 1.0 5.0 2.0 / 1.0 2.0 3.0 1.0 1.0 | 0.0 1.0 1.0 3.0 4.0 | 0.0 0.0 1.0 5.0 5.0 \ 0.0 0.0 0.0 0.0 -3.0 / 1.0 2.0 3.0 1.0 1.0 | 0.0 1.0 1.0 3.0 4.0 | 0.0 0.0 1.0 5.0 5.0 \ 0.0 0.0 0.0 0.0 -1.0

Velvet revolution, my ass 0

Once upon a time, an evil was replaced by smaller one, which then grew into an even bigger one, than the former one. Throughout the time, there was like thousand similar moments. There’s nothing to celebrate. Nothing at all.

These times, our nation is doomed more than ever before, due to the european union and the lisbon treaty, so I can’t fucking understand, what are youse assholes celebrating. Pissing on our ancestors graves would be more appropriate for this situation.

Knights of mt. Blaník, where are ye…
There’s almost nothing left of Czech Republic, so where the fuck are ye!

ČVUT FEL 2

mě naplňuje.

Včera a dneska jsem se učil na písemku z Úvodu do operačních systémů… a dneska jsem ji dal za plný počet. Předmět, se kterým jsem doposud válčil tak získal svoje kouzlo. Každá věc tak učiní, když si ji podmaním.
A když nás cvičící zasvěcoval do skriptování pod bashem… mobilizoval jsem všechny neurony a hltal zářivá klíčová slova objevující se jedno podruhém v mém JOE. I pochopil jsem, že sem patřím.

Z algoritmizace mám v půlce semestru šestnáct bodů… z deseti potřebných. Nakonci budu mít pravděpodobně bodů teoreticky na dva zápočty :). Baví mě v šest večer si sednout k počítači a sázet kód až do půlnoci, java nejava, a potom spokojeně odejít spát.

Matematika se stala skoro mým koníčkem. Nikdy jsem netušil, že derivování, integrování, vyšetřování nebo aproximace funkcí toho v sobě může skrývat tolik o podstatě světa. A co teprve věci, o kterých ještě nevím… věci, které na mě čekají v dobrovolné matematice 2 a dále.

Lineární algebra je jako klíč, který zapadá do spousty zámků a dokážete s ním jednoduše odemknout mnoho dveří, pod kterými jste se kdysi museli podkopávat. Je to jediný předmět, který mě dokáže vypnout… tj. dostat do stavu, kdy nechápu a mozek odmítá přijímat další informace.

A v pátek na pinčesu vždycky nachvíli na všechno zapomenu a pořádně si zamlátím do toho malého bílého sféromaku.

Je tolik pýchy v kapitulaci… 0

Je tolik pýchy v kapitulaci…
a tolik cti… snad více než ve vítězství.
A ve zklamání tolik vášně… snad více než v úspěchu.
A v rezignovanosti tolik entuziasmu…
V protikladech ekvivalencí…

My jsme pouze vybrali jednu stranu jako dobrou… a druhou jako špatnou.

Hádanka za pintu 10

EDIT: Pinta Guinnessu je připravena k vyzvednutí. Až budu nabízet další, doufám, že se zapojí víc lidí :).

Kdo najde v následujícím obrázku chybu, má u mě zcela závazně pintu tý černý věci. Beru prvního komentátora a pak dle výběru :).

A tady je jedna pro… 0

kamarády, kteří to mají doleva a chybí jim v čechách vhodná strana… něco jako Sinn Féin.

Alice a vůbec písmeno A 14

Písmeno A je krásné. Vypadá trochu jako runa a vyslovuje se vždy s určitou intenzitou a naléhavostí, kterou ostatní samohlásky postrádají. V následujících řádcích bych chtěl vyjádřit, jak vnímám krásu slov, jak rozlišuji slova na hezká a nehezká… a nakonec, jak si například podle krásy jména vytvořím představu o jeho nositeli.

Jak už jste si přečetli, miluji písmeno A (a nebo æ), a zvláště v případě, že na něj nějaké slovo začíná. Není to ale tak jednoduché, jak by se mohlo zdát, protože některá písmena si mohou začínat na A jak chtějí, a přesto se mi budou jevit přímo hnusná.

Aby se písmeno A neprznilo, musí se vyskytovat v kombinaci s „ušlechtilou“ sadou souhlásek :), což jsou takové, které pro vyslovení nepotřebují měkké patro. Podle mě platí, že čím dále od krku souhlásku vyslovíte, tím je ušlechtilejší :).

Opačné souhlásky – hnusné :) – jsou takové, které měkké patro potřebují – g, q, ch, j, k, x. Takové souhlásky A, popř. Æ przní.

Dále platí, že pokud samohlásku obklopují dvě souhlásky, které jsou stejného typu (například se obě vyslovují rty), vzniká hnusná kombinace, která se vyslovuje nepříjemně. Z toho vyplývá, že kombinace je hezká, pokud se obklopující souhlásky vyslovují nestejně tak, aby byl přechod od jedné ke druhé rychlý.

Poslední pravidlo zní, že ve slově by se měla pravidelně opakovat stuktura – 1 samohláska – 1souhláska, přičemž nejlepší varianta je, že slovo začíná samohláskou a končí samohláskou, němým písmenem nebo nerhotickým r.

Jedno takové slovo je právě Alice [ælis]. Znaky pro jednotlivá písmeny nádherně vyvažují ostré a kulaté hrany, čímž dělají slovo pěkné i na pohled. Samotné slovo potom začíná na A, pokračuje elkem na tvrdém patře, pokračuje íčkem na opačné straně a končí eskem, kdy se jazyk nedotýká. Prostě nádherné slovo :). A tak není divu, že jméno Alice považuji za nejhezčí z běžné dívčí sady jmen a jmenuje-li se tak někdo, okamžitě si představím hezkou dívku.

Trochu jsem tak pátral po různých postavách jménem Alice v literatuře a filmu, a objevil jsem k tomuto jménu i dokonalé příjmení, které, jak jinak, začíná na A. To příjmení je Abernathy [æbənæθi]. Když vyslovíte Abernathy, použijete skoro všechny druhy „předních“ souhlásek v takovém pořadí, že mají nestejnou výslovnost jako předešlé souhlásky nebo samohlásky, a zároveň slovo obsahuje dvě Æ. Dokonalé příjmení.

Čili Alice Abernathy je v úplně nejvyšším patře estetického žebříčku jmen :).

Proto mám (zřejmě) rád jak Resident Evil, tak Alice in wonderland, tak American McGee’s Alice a vůbec všechno, kde nějaká Alice figuruje.

Ale abychom nezůstali jen u hezkých jmen a hezkých slov, pojďme se podívat také na ty, které můj estetický motor považuje za méně hezká.

Jedno z takových jmen je například moje jméno :). Michal obsahuje prznící souhlásky, a to i v jeho anglické variantě, poněvadž pochází z Hebrejštiny a Hebrejština nemá jedinou hezkou souhlásku. O mém příjmení se už vůbec nebavím… čtyři po sobě jdoucí stejně vyslovované souhlásky a absence A je naprosto brutální zlo :).

Další nepěkné příjmení je třeba Obama. Sice obsahuje A, ale v arci hnusné kombinaci – bam, kde b a m se vyslovuje stejným způsobem.

Z českých jmen jsou taková ta nepěkná napříkald Broněk, Zdeněk, Ignác, Lenka (n s prodlouženou nohou – zadní), Magda, Eliška, Jakub, Michaela a tak podobně.

Hezká česká jména jsou: Alice, Alena, Amanda, Lucie, Pavel, Adam…

Když po mně někdy bude chtít domácí úkol neznámá Magda Gregorová, má minimální šanci. Naopak Alice Abernathy by měla šanci stoprocentní.