Veľký \ začiatok 1 a 0 & 2 \\ -1 & ...
Po absolvovaní tohto laboratória bude študent schopný:
Teoretické pojmy
Matrix
Matica je homogénna a dvojrozmerná zbierka prvkov. Môžu byť prístupné pomocou dvoch indexov, očíslovaných, ako je to v prípade vektorov, začínajúcich od 0. Deklarácia matice je v tvare:
Počet prvkov poľa bude dim_1 * dim_2 a význam každej dimenzie je vecou logiky programu. V matematike môže prvá dimenzia znamenať riadok a druhý stĺpec pre každý prvok, nie je to však povinné. Aby však program správne fungoval, je potrebné v zdrojovom kóde dodržiavať zvolené významy.
Multidimenzionálne obrazy
Vektory a matice možno extrapolovať na všeobecný pojem viacrozmerného poľa, ktorý je uvedený takto:
Aj keď v prípade viac ako 3 rozmerov nemusí mať obraz už konkrétny alebo fyzický význam, môže byť obzvlášť užitočný v mnohých situáciách. V tomto laboratóriu sa však obmedzíme na dvojrozmerné maľby.
Sčítanie a násobenie matíc
Súčet matíc

$$ \ Veľké \ začiatok 1 a 3 \\ 0 a 4 \\ 5 a 8 \ koniec + \ začiatok 2 a 5 \\ 1 & 2 \\ 6 & 1 \ koniec = \ začiatok 3 a 8 \\ 1 a 6 \\ 11 & 9 \ end $$
Násobenie matíc

$$ \ Veľké \ začiatok 1 a 0 a 2 \\ -1 a 3 a 1 \ koniec \ cdot \ začiatok 3 a 1 \\ 2 a 1 \\ 1 a 0 \ koniec = \ začiatok 1 \ krát 3 + 0 \ krát 2 + 2 \ krát 1 & 1 \ krát 1 + 0 \ krát 1 + 2 \ krát 0 \\ -1 \ krát 3 + 3 \ krát 2 + 1 \ krát 1 & -1 \ krát 1 + 3 \ krát 1 + 1 \ krát 0 \ end = \ začiatok 5 & 1 \\ 4 & 2 \ end $$
Zastúpenie v pamäti
Znalosť pamäťovej reprezentácie polí vám pomôže lepšie pochopiť, ako pracovať s týmito typmi údajov, a vyhnúť sa tak častým aj najjemnejším chybám. Ako je známe, každá premenná má priradenú adresu v pamäti a zaberá určitú dĺžku meranú v bajtoch. Štandard C vyžaduje, aby bolo pole uložené v oblasti spojitej pamäte, takže pre pole vo forme: karta T [dim1] [dim2]… [dimn]; veľkosť obsadená v pamäti bude sizeof (T) * dim1 * dim2 * ... * dimn. Ďalej zvážime konkrétny prípad vektorového vektora dĺžky n a niektorého jeho prvku z polohy i. Keď narazí na názov vect, kompilátor porozumie „adrese v pamäti, z ktorej vektorový vect začína“. Operátor indexovania [] použitý na názov vect dáva príkaz kompilátoru „vyhodnotiť ten prvok typu T, ktorý je na pozícii i vo vektore vychádzajúc z adresy vect“. To sa dá vyjadriť priamo: "vyhodnotenie premennej typu T z adresy vect + i * sizeof (T)" .
V poslednej formulácii si všimnete, že veľkosť vektora uvedeného v deklarácii už nezasahuje v žiadnej podobe. To bolo potrebné iba na to, aby kompilátor vedel, koľko pamäte má prideliť na svoju reprezentáciu. Pamätajte tiež na to, že indexovanie mimo vyhradeného pamäťového priestoru je povolené, a program tak bude mať omylom prístup k iným oblastiam pamäte, čo môže mať vážne následky. V lepšom prípade sa náš program bude správať veľmi zvláštne (chyby na úplne nepredvídateľných miestach) a v najhoršom prípade bude celý systém uzamknutý v prípade systémov, ktoré nemajú implementované priestory virtuálnej pamäte špecifické pre každú aplikáciu - platformy Windows NT a Linux).
Skutočnosť, že hranica medzi vektormi a adresami pamätí je v jazyku C taká jemná, že jej syntax umožňuje zvláštne výrazy, ako napríklad:
Druhé vyjadrenie jednoducho znamená „priraďte 5 premennej char adresy 3 + a * sizeof (char) = 3 + a“. Toto je ekvivalent k [3] = 5;
Ďalšia výhoda sa objaví aj pri definovaní parametra funkcie vektorového typu, v takom prípade nie je potrebné špecifikovať jeho veľkosť: void sort (int [] vect, n);