Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Яровой_Информатика.doc
Скачиваний:
49
Добавлен:
13.04.2015
Размер:
3.2 Mб
Скачать

2.1.6. Линейные преобразования

Аппарат матриц позволяет более просто представлять различные математические операции над элементами матриц. В частности, систему линейных алгебраических уравнений:

a11x1+a12x2+…+a1nxn=b1

a21x1+a22x2+…+a2nxn=b2… (7.7)

am1x1+am2x2+…+amnxn=b3

можно записать одним матричным равенством:

a11

a12

a1n

a21

a22

a2n

am1

am2

amn

x1

x2

xm

b1

b2

bm


* =

A * x = b

Более кратко матричное равенство можно записать

A*x=b. (7.8)

Систему линейных алгебраических уравнений (7.7) обычно рассматривают как линейное преобразование совокупности величин (x1,x2, … , xm) в совокупность (b1,b2,…,bm). Это преобразование полностью определяется коэффициентами aij(i=1,2, …, m; j=1,2, …,n) матрицы А. На языке матриц линейное преобразование b=A*x означает преобразование столбца x в столбец b, которое определяется матрицей преобразования А.

Если величины x1,x2, …, xm получаются из некоторой совокупности величин z1,z2 ,…, zm, посредствам линейного преобразования x=B*z, где x и z –столбцы соответствующих величин, а В - матрица их преобразования, то формальной подстановкой x в матричное уравнение (8) получаем:

B=A*x=A*(B*z)=(A*B)*z=C*z,

где С=А*В – матрица преобразования величины z в b.

2.2 Массивы и переменные с индексами

В языке Object Pascal для хранения и обработки упорядоченных совокупностей данных различной природы (различных типов, в частности, векторов и матриц, элементами которых являются вещественные или целые числа) введено понятие массив.

Массив – это упорядоченная совокупность однотипных данных, которая характеризуется:

- своими именами;

- типом хранимых данных;

- нумерацией элементов;

- размером (числом хранимых элементов);

- размерностью.

В программе на языке Object Pascal (в дальнейшем просто в программе) каждый массив должен быть описан (объявлен) в разделе описания типов (после ключевого слова type(тип)) или в разделе описания переменных (после ключевого слова var).Описания записываются перед началом записи исполняемых операторов модуля.

Под типом в Object Pascal понимают множество допустимых значений, которые может иметь каждый элемент массива, множество допустимых операций для массива и формат внутреннего представления каждого элемента массива в памяти ПК.

Для компилятора описание типа массив определяет:

- объём памяти, который необходимо выделить для размещения всех элементов массива;

- набор допустимых операций, который программист может применять для элементов массива.

Каждое описание массива заканчивается символом “;” и иногда называется неисполняемым оператором (т.е. только представляющем информацию компилятору о массиве) или строкой программы.

Например,

- если необходимо описать вектор x(x1,x2 …,x20), элементами которого являются целые числа, следует после слова var записать:

var

x: array [1..20] of integer; (7.9)

- если необходимо описать две матрицы A={aij}, B={aij} (i=1,2, … 13; j=1,2, …, 21), элементами которых являются вещественные числа, то следует записать:

var

a,b: array [1..13, 1..21] of real; (7.10)

Как следует из примеров, описаниeмассива начинается с записи имени (или нескольких имён, перечисленных через”,”), после которого через символ “:” записывается ключевое словоarray( массив). За словомarrayв квадратных скобках указывается диапазон, т. е. нижняя и верхняя границы изменения индекса,разделённых символов.. , с помощью которых компилятор определяет общее количество элементов массива. Запись <Нижняя граница>.. <Верхняя граница> образует тип-диапазон. Если массив двумерный (т. е. матрица), то тип-диапазон второго индекса записывается через , . За словомof( из) указывается тип элементов, образующих массив.

Трёхмерный массив (совокупность “плоских” матриц), элементами которого имеют строковый тип, можно описать:

var

massiv: array [1..20, 1..30, 1..7] of string;

В общем случае описание массивов задастся следующим образом:

var

<Список имён>: array[<Список типа-диапазон>]of<Тип>;

где: <Тип> – любой тип ObjectPascal.

В памяти ПК элементы массива следуют друг за другом так, что при переходе от младших адресов к старшим наиболее быстро меняется самый правый индекс.

Иногда описания массивов производят в такой последовательности: в разделе type(тип) указывают имя типа, диапазоны изменения индексов и тип элементов массива, а затем в разделеvarуказывают конкретные имена массивов (переменных, имеющих тип массив).

Например, описание массивов в примерах (9), (10) можно выполнить следующим образом:

type

vector = array [1..20] of integer;

matr = array [1...13, 1...21] of real;

var

x: vector;

a,b:matr;

Доступ к элементам массива осуществляется по индексу (номеру). Этот индекс указывается в квадратных скобках сразу за именем массива (такое действие называется индексированием). Запись:

<Имя массива> [<Список индексов>]

называется переменной с индексом, где <Список индексов> – один или несколько индексов, перечисленных через ”,”.

Переменная с индексами именует значение, являющееся одним элементом массива. Элемент массива, именуемый данной переменной с индексами, определяется текущими значениями индексов этой переменной. Каждый индекс по своему смыслу принимает целочисленное значение, т.е в простейшем случае может иметь тип integer(целый).

Примеры:

1. Значением переменной а [2,3] является элемент матрицы а23;

2. Значение переменной а[i,j] определяется текущими значениями i и j;

3. Для получения вещественной матрицы В={bij} (i,j=1,2,…7) каждый элемент, который равен 0 необходимо:

- в разделе описания переменных дать описание двухмерного массива с именем b и двух переменных целого типа i,j:

var

b: array [1..7,1..7] of real;

i,j: integer;

- в разделе реализации (после ключевого слова implementation (реализация)) в нужном месте записать операторы цикла, в которых оператором присваивания каждому элементу массива b присваивается значение 0.0:

for i:=1 to 7 do

for j:=1 to 7 do

b[i,j]:=0.0;

В Object Pascal введены динамические массивы - это массивы у которых нижняя граница индексов по любому измерению равна 0, а верхняя граница (следовательно и объем памяти ПК для размещения всех элементов массива) устанавливается при выполнении программы с помощью стандартной процедуры SetLength (установить длину).

Динамические массивы обычно применяются когда, размер обрабатываемых массивов неизвестен и определяется при выполнении программы в зависимости от действий пользователя или объема обрабатываемой информации.

Описание (объявление) массива содержит только его имя и тип элементов, при этом компилятором не выделяется память для элементов массива.

Например;

-описание вещественного вектора а(а12,…аn) может выглядеть так:

var

a:array of real;

- описание вещественных матриц B={bij} и C={cij}(i=1,2,…m; j=1,2,…n)

может выглядеть:

var

b, c: array of array of real;

Это описание в переводе можно читать так: b и с – это массивы из массивов, элементами которых является вещественный тип.

Для выделения компилятором памяти для элементов динамических массивов следует вызвать стандартную подпрограмму SetLength операторами:

SetLength(а,10);

которая выделит для массива a место в памяти под 10 элементов и задаст нулевые значения всех элементов;

SetLength(b,7,8);

которая выделит для массива b место в памяти под 7*8=56 элементов и задаёт нулевые значения всех элементов;

SetLength(с,10,5);

которая выделит для массива с место в памяти под 10*5=50 элементов и задаст нулевые значения всех элементов;

Поскольку индексы динамического массива – всегда целые числа, начинающиеся с 0, то:

массив а содержит элементы от а[0] до а[9];

массив b содержит 7 строк с нумерацией от 0 до 6 и 8 столбцов с нумерацией от 0 до 7;

массив с содержит 10 строк с нумерацией от 0 до 9 и 5 столбцов с нумерацией от 0 до 4.

Доступ к элементам динамических массивов осуществляется так же, как и для статических массивов. Например,

  1. Значением переменной а[0] является первый элемент а1, значением а[9] – последний элемент а10 вектора a.

  2. Значением переменной b[3,6] является элемент матрицы В, находящийся на пересечении 4-ой строки и 7-го столбца, т.е. b47.

  3. Значением переменной c[3,2] является элемент c43.

Повторный вызов SetLength к уже существующему в памяти массиву изменяет его размер. Если новое значение верхней границы больше предыдущего, то все значения элементов сохраняются и в конце добавляются новые нулевые элементы. Если же новое значение верхней границы меньше предыдущего, то массив усекается и в нем остаются значения первых элементов.

Удалить из памяти динамический массив можно одним из 3-х способов:

-оператором присваивания:

a:=nil;

...

т.е. массиву а присвоить значение nil(ничего);

-вызвать стандартную процедуру Finalize оператором

Finalize(a);

-вызвать стандартную процедуру SetLength оператором

SetLength(a,0);