Nagy \ kezdődik 1 & 0 & 2 \\ -1 & ...

A labor elvégzése után a hallgató képes lesz:

Elméleti fogalmak

Mátrix

A mátrix egy homogén és kétdimenziós elemgyűjtemény. Két indexelt számmal érhetők el, mint a vektorok esetében, 0-tól kezdődően. A mátrix deklarációja a következő:

A tömb elemeinek száma dim_1 * dim_2 lesz, és az egyes dimenziók jelentősége a program logikájának kérdése. A matematikában az első dimenzió jelentheti az egyes elemek sorát és a második oszlopát, de ez nem kötelező. Ahhoz azonban, hogy a program megfelelően működjön, a választott jelentéseket az egész forráskódban be kell tartani.

Többdimenziós festmények

A vektorokat és mátrixokat extrapolálhatjuk a többdimenziós tömb általános fogalmához, amelyet a következőképpen állítunk fel:

Habár több mint 3 dimenzió esetén a festményeknek már nincs konkrét vagy fizikai jelentése, sok helyzetben különösen hasznosak lehetnek. Ebben a laboratóriumban azonban csak kétdimenziós festményekre szorítkozunk.

Mátrixok összeadása és szorzása

A mátrixok összege

nagy

$$ \ Large \ elején 1 & 3 \\ 0 & 4 \\ 5 & 8 \ end + \ elején 2 & 5 \\ 1 & 2 \\ 6 & 1 \ end = \ elején 3 & 8 \\ 1 & 6 \\ 11 & 9 \ end $$

Mátrixok szorzása

elején elején
A bal oldali példa megmutatja, hogyan számítják ki az „AB” (1,2) és (3,3) értékeit, ha „A” 3 × 2 mátrix, és „B” 2 × 3 mátrix. A mátrix elemének kiszámításához vegye figyelembe a nyilaknak megfelelő sorokat vagy oszlopokat az egyes mátrixokban. A bennük lévő elemeket a vektorokon történő szorzás alapján 2-gyel megszorozzuk, majd a szorzatok összege képezi az elemet a végső mátrixban

$$ \ Large \ elején 1 & 0 & 2 \\ -1 & 3 & 1 \ end \ cdot \ elején 3 & 1 \\ 2 & 1 \\ 1 & 0 \ end = \ elején 1 \ alkalommal 3 + 0 \ 2-szer 2-szer 1-szer 1-szer 1-szer 1 + 0-szor 1 + 2-szer 0-1-szer 3 + 3-szor 2 + 1-szer 1-szer 1-szer 1 + 3-szor 1-szer + 1 \ szer 0 \ end = \ kezdődik 5 & 1 \\ 4 & 2 \ end $$

Képviselet a memóriában

A tömbök memóriareprezentációjának ismerete segít jobban megérteni, hogyan kell dolgozni az ilyen típusú adatokkal, és elkerülhetők a gyakori és a legfinomabb hibák is. Mint ismeretes, minden változó társított címmel rendelkezik a memóriában, és bizonyos hosszúságot foglal el bájtokban mérve. A C szabvány előírja, hogy egy tömböt egy folyamatos memóriaterületen kell tárolni, így egy tömb formájú formában: T fül [dim1] [dim2]… [dimn]; a memóriában elfoglalt méret a (T) * dim1 * dim2 *… * dimn méret lesz. Továbbá megvizsgáljuk az n hosszúságú vektor vektor és annak egyes elemeinek egyedi esetét az i pozícióból. Amikor találkozik a vect névvel, a fordító meg fogja érteni "azt a címet a memóriában, ahonnan a vektor vekt kezdődik". A vect névre alkalmazott indexelő operátor [] utasítja a fordítót, hogy "értékelje azt a T-típusú elemet, amely a vektorban a vect címtől kezdve az i pozícióban van". Ezt közvetlenül kifejezhetjük: "a T-típusú változó kiértékelése a vect + i * sizeof (T) cím alapján" .

Az utolsó megfogalmazásban észreveszi, hogy a deklarációnál megadott vektor mérete már semmilyen formában nem avatkozik be. Erre csak azért volt szükség, hogy a fordító tudja, mennyi memóriát kell lefoglalni az ábrázolásához. Vegye figyelembe azt is, hogy a lefoglalt memóriaterületen kívüli indexelés megengedett, és így a program véletlenül képes lesz hozzáférni más memóriaterületekhez, amelyek komoly következményekkel járhatnak. Legjobb esetben a programunk nagyon furcsán fog viselkedni (hibák teljesen kiszámíthatatlan helyeken), és a legrosszabb esetben az egész rendszer le lesz zárva azoknál a rendszereknél, amelyek nem valósítottak meg minden alkalmazáshoz tartozó virtuális memóriaterületet - Windows NT platformok és Linux).

Az a tény, hogy a vektorok és a memória címek közötti határ olyan finom a C nyelvben, szintaxisa furcsa kifejezéseket tesz lehetővé, mint például:

Ez utóbbi állítás egyszerűen azt jelenti, hogy "rendeljen 5-öt a 3 + a cím char változójához + a * sizeof (char) = 3 + a". Vegye figyelembe, hogy ez ekvivalens a [3] = 5 értékkel;

Egy másik előny akkor jelenik meg, amikor meghatározzuk egy függvény, vektor típusú paraméterét, ebben az esetben nem szükséges megadni annak méretét: void sort (int [] vect, n);