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

След завършване на тази лаборатория студентът ще може:

Теоретични представи

Матрица

Матрицата е еднородна и двуизмерна колекция от елементи. Те могат да бъдат достъпни с помощта на два индекса, номерирани, както при векторите, започвайки от 0. Декларацията на матрица е във вид:

Броят на елементите на масив ще бъде dim_1 * dim_2, а значението на всяко измерение е въпрос на програмна логика. В математиката първото измерение може да означава реда и втората колона за всеки елемент, но това не е задължително. Въпреки това, за да може програмата да работи правилно, избраните значения трябва да се спазват в целия изходен код.

Многоизмерни картини

Векторите и матриците могат да бъдат екстраполирани към общото понятие за многомерен масив, което се посочва, както следва:

Въпреки че в случай на повече от 3 измерения картините може вече да нямат конкретно или физическо значение, те могат да бъдат особено полезни в много ситуации. В тази лаборатория обаче ще се ограничим до двуизмерни картини.

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

Сумата от матриците

големи

$$ \ Large \ begin 1 & 3 \\ 0 & 4 \\ 5 & 8 \ end + \ begin 2 & 5 \\ 1 & 2 \\ 6 & 1 \ end = \ begin 3 & 8 \\ 1 & 6 \\ 11 & 9 \ край $$

Умножение на матрици

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

$$ \ Large \ begin 1 & 0 & 2 \\ -1 & 3 & 1 \ end \ cdot \ begin 3 & 1 \\ 2 & 1 \\ 1 & 0 \ end = \ begin 1 \ times 3 + 0 \ по 2 + 2 \ по 1 & 1 \ по 1 + 0 \ по 1 + 2 \ по 0 \\ -1 \ по 3 + 3 \ по 2 + 1 \ по 1 & -1 \ по 1 + 3 \ по 1 + 1 \ по 0 \ end = \ begin 5 & 1 \\ 4 & 2 \ end $$

Представяне в паметта

Познаването на представянето на паметта на масиви ви помага да разберете по-добре как да работите с тези типове данни и да избегнете както често срещани, така и най-фините грешки. Както е известно, всяка променлива има свързан адрес в паметта и заема определена дължина, измерена в байтове. Стандарт C изисква масивът да се съхранява в непрекъсната област на паметта, така че за масив от формата: T раздел [dim1] [dim2] ... [dimn]; размерът, зает в паметта, ще бъде sizeof (T) * dim1 * dim2 * ... * dimn. По-нататък ще разгледаме частния случай на вектор вектор с дължина n и на някакъв елемент от него, от позиция i. Когато срещне името vect, компилаторът ще разбере "адреса в паметта, от който векторният вектор започва". Индексиращият оператор [], приложен към името на vect, инструктира компилатора да „оцени този елемент от тип T, който е в позиция i във вектора, започвайки от адреса на vect“. Това може да се изрази директно: „оценка на променливата от тип T от vect + i * sizeof (T) адрес“ .

В последната формулировка забелязвате, че размерът на вектора, даден в декларацията, вече не се намесва под никаква форма. Това беше необходимо само за компилатора, за да знае колко памет да отдели за неговото представяне. Също така имайте предвид, че е разрешено индексирането извън разпределеното пространство в паметта и така програмата случайно ще има достъп до други области на паметта, което може да има сериозни последици. В най-добрия случай нашата програма ще се държи много странно (грешки на напълно непредсказуеми места), а в най-лошия случай цялата система ще бъде блокирана в случай на системи, които не са внедрили пространства за виртуална памет, специфични за всяко приложение - платформи Windows NT и Linux).

Фактът, че границата между вектори и адреси на паметта е толкова фина в езика C, неговият синтаксис позволява странни изрази, като например:

Последното изявление просто означава "присвояване на 5 на променливата char от адрес 3 + a * sizeof (char) = 3 + a". Имайте предвид, че това е еквивалентно на [3] = 5;

Също така се появява още едно предимство при дефиниране на параметър на функция от векторен тип, като в този случай не е необходимо да се посочва нейният размер: void sort (int [] vect, n);