Големи \ започнете 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 \ край $$
Умножение на матрици

$$ \ 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);