Голем \ започнете 1 & 0 & 2 \\ -1 & ...

По завршувањето на оваа лабораторија студентот ќе може:

Теоретски поими

Матрица

Матрицата е хомогена и дводимензионална колекција на елементи. До нив може да се пристапи со помош на два индекси, нумерирани, како кај векторите, почнувајќи од 0. Декларацијата на матрицата е од форма:

Бројот на елементи од низата ќе биде пригушен * * затемнето_2, а значењето на секоја димензија е прашање на логика на програмата. Во математиката, првата димензија може да значи ред и втора колона за секој елемент, но тоа не е задолжително. Меѓутоа, со цел програмата да работи правилно, избраните значења мора да се набудуваат низ изворниот код.

Мултидимензионални слики

Векторите и матриците можат да бидат екстраполирани на општиот поим за повеќедимензионална низа, што е наведено како што следува:

Иако, во случај на повеќе од 3 димензии, сликите можеби повеќе немаат конкретно или физичко значење, тие можат да бидат особено корисни во многу ситуации. Во оваа лабораторија, сепак, ќе се ограничиме на дводимензионални слики.

Собирање и множење на матрици

Збирот на матриците

започнете

$$ \ Голем \ започнете 1 & 3 \\ 0 & 4 \\ 5 & 8 \ крај + \ започнете 2 и 5 \\ 1 & 2 \\ 6 & 1 \ крај = \ започнете 3 & 8 \\ 1 & 6 \\ 11 и 9 \ крај $ $

Множење на матрици

започнете крај
Примерот лево покажува како се пресметуваат вредностите (1,2) и (3,3) на „AB“ ако „A“ е 3 × 2 матрица, а „B“ е 2 × 3 матрица. За да пресметате елемент во матрицата, разгледајте ред или колона во секоја матрица според стрелките. Елементите во нив се множат со 2 според множењето на вектори, тогаш збирот на производите го сочинува елементот во крајната матрица

$ $ \ Голем \ започнете 1 & 0 & 2 \\ -1 & 3 & 1 \ крај \ cdot \ започнете 3 & 1 \\ 2 & 1 \\ 1 & 0 \ крај = \ започнете 1 \ пати 3 + 0 \ пати 2 + 2 \ пати 1 и 1 \ пати 1 + 0 \ пати 1 + 2 \ пати 0 \\ -1 \ пати 3 + 3 \ пати 2 + 1 \ пати 1 & -1 \ пати 1 + 3 \ пати 1 + 1 \ пати 0 \ крај = \ започне 5 & 1 \\ 4 & 2 \ крај $ $

Претставување во меморијата

Познавањето на мемориската репрезентација на низите ви помага подобро да разберете како да работите со овие типови на податоци и да избегнете и вообичаени и суптилни грешки. Како што е познато, секоја променлива има поврзана адреса во меморијата и зафаќа одредена должина, измерена во бајти. Стандардот C бара низата да се чува во областа на континуирана меморија, така што за низа од формата: T tab [dim1] [dim2]… [dimn]; големината окупирана во меморијата ќе биде sizeof (T) * dim1 * dim2 *… * dimn. Понатаму, ќе го разгледаме конкретниот случај на векторски вектор со должина n, и на некој негов елемент, од позиција i. Кога ќе се сретне со името vect, компајлерот ќе ја разбере „адресата во меморијата од која започнува векторот vect“. Операторот за индексирање [] применет на името на вект го инструира компајлерот „да го оцени тој елемент од типот Т, кој е во позиција i во векторот, почнувајќи од век адресата“. Ова може да се изрази директно: "проценка на променливата од типот Т од адресата vect + i * sizeof (T)" .

Во последната формулација забележувате дека големината на векторот дадена на декларацијата повеќе не интервенира во каква било форма. Тоа беше потребно само за компајлерот да знае колку меморија треба да одвои за негово претставување. Исто така, забележете дека индексирањето надвор од доделениот мемориски простор е дозволено, и така, програмата случајно ќе може да пристапи до другите мемориски области, што може да има сериозни последици. Во најдобар случај, нашата програма ќе се однесува многу чудно (грешки во тотално непредвидливи места), а во најлош случај целиот систем ќе биде заклучен во случај на системи кои немаат имплементирано простори за виртуелна меморија специфични за секоја апликација - Windows NT платформи и Linux).

Фактот дека границата помеѓу векторите и мемориските адреси е толку добра во јазикот Ц, неговата синтакса дозволува чудни изрази, како што се:

Последната изјава едноставно значи „додели 5 на променливата char од адреса 3 + a * sizeof (char) = 3 + a“. Забележете дека ова е еквивалентно на [3] = 5;

Исто така, се појавува друга предност при дефинирање на параметар на функција, од векторски тип, во тој случај не е потребно да се одреди нејзината големина: void sort (int [] vect, n);