Матрицы
Матрицы позволяют хранить данные в виде таблицы из строк и столбцов.
Создание матрицы
Двумерный динамический массив (матрица) имеет тип array[,] of T, а память для него выделяется с указанием числа строк и столбцов.
После создания числовая матрица автоматически заполняется нулями.
begin
var n := 3;
var m := 4;
var a: array[,] of integer := new integer[n,m];
a.Print;
end.
Результат:
0 0 0 0
0 0 0 0
0 0 0 0
Метод Print выводит матрицу в табличном виде с выравниванием по столбцам.
Создание матрицы с начальными значениями
Функция Matr создаёт матрицу из заданных строк. Строки задаются одномерными массивами и должны иметь одну длину.
begin
var a := Matr(
[1,2,3,4],
[5,6,7,8],
[9,10,11,12]
);
a.Println(3);
Println(a)
end.
Результат:
1 2 3 4
5 6 7 8
9 10 11 12
[[1,2,3,4],[5,6,7,8],[9,10,11,12]]
В вызове a.Println(3) число 3 задаёт ширину столбца при выводе матрицы.
Обычный Println(a) выводит матрицу как массив строк.
Матрица случайных чисел
MatrRandomInteger создаёт матрицу заданного размера и заполняет её случайными целыми числами.
begin
var a := MatrRandomInteger(3,4);
a.Println;
end.
Результат:
54 39 93 39
18 24 57 8
12 66 49 5
От запуска к запуску результат будет меняться.
Матрица случайных вещественных чисел
MatrRandomReal создаёт матрицу заданного размера и заполняет её случайными вещественными числами.
Метод Println(6,1) выводит элементы в поле шириной 6 символов с одним знаком после десятичной точки.
begin
var a := MatrRandomReal(3,4);
a.Println(6,1);
end.
Например:
3.6 0.5 4.6 4.3
6.1 9.5 2.9 3.4
7.1 5.4 7.1 1.8
Размеры матрицы
Свойства RowCount и ColCount возвращают количество строк и столбцов матрицы.
begin
var a := Matr(
[1,2,3,4],
[5,6,7,8],
[9,10,11,12]
);
Println(a.RowCount);
Println(a.ColCount);
end.
Результат:
3
4
Доступ по индексам и изменение элемента
К элементу матрицы обращаются по двум индексам: номеру строки и номеру столбца. Индексация - с нуля.
Индексы с ^ позволяют обращаться к строкам и столбцам с конца: ^1 обозначает последнюю строку или последний столбец.
begin
var a := Matr(
[1,2,3],
[4,5,6]
);
Println(a[1,2]);
a[1,1] := 10;
a[^1,^1] := 77;
a.Print;
end.
Результат:
6
1 2 3
4 10 77
Суммы элементов по строкам
С помощью вложенных циклов можно вычислить сумму элементов каждой строки матрицы.
begin
var a := Matr(
[1,2,3],
[4,5,6],
[7,8,9]
);
for var i := 0 to a.RowCount - 1 do
begin
var s := 0;
for var j := 0 to a.ColCount - 1 do
s += a[i,j];
Println(s);
end;
end.
Результат:
6
15
24
Получение строки и столбца
Методы Row и Col возвращают строку или столбец матрицы в виде одномерного массива.
begin
var a := Matr(
[1,2,3,2],
[4,5,6,7],
[8,2,9,10]
);
a.Row(0).Print;
a.Col(1).Print;
Println(a.Row(0).CountOf(2));
end.
Результат:
1 2 3 2
2 5 2
2
Суммы строк с помощью Row
Метод Row позволяет получить строку матрицы как одномерный массив и применить к ней стандартные методы массива.
begin
var a := Matr(
[1,2,3],
[4,5,6],
[7,8,9]
);
for var i := 0 to a.RowCount - 1 do
Println(a.Row(i).Sum);
end.
Результат:
6
15
24
Проверка равенства матриц
Метод MatrEqual проверяет, имеют ли матрицы одинаковые размеры и равны ли их соответствующие элементы.
Операция = проверяет, ссылаются ли переменные на одну и ту же матрицу.
begin
var a := Matr(
[1,2],
[3,4]
);
var a1 := Matr(
[1,2],
[3,4]
);
Println(a.MatrEqual(a1));
Println(a = a1);
end.
Результат:
True
False
Присваивание и копирование матрицы
При обычном присваивании копируется ссылка на матрицу, поэтому две переменные ссылаются на один и тот же объект. Изменение матрицы через одну переменную будет видно и через другую.
Функция Copy создаёт независимую копию матрицы.
begin
var a := Matr(
[1,2,3,4],
[5,6,7,8],
[9,10,11,12]
);
var b := Copy(a);
var c := a;
b[1,1] := 777;
c[1,1] := 888;
a.Println;
b.Println;
c.Println;
end.
Результат:
1 2 3 4
5 888 7 8
9 10 11 12
1 2 3 4
5 777 7 8
9 10 11 12
1 2 3 4
5 888 7 8
9 10 11 12
Поиск элемента в матрице
Операция in позволяет проверить, содержится ли значение среди элементов матрицы.
begin
var a := Matr(
[1,2,3],
[4,5,6]
);
Println(4 in a);
Println(10 in a);
end.
Результат:
True
False
Срез матрицы
Срез по двум измерениям позволяет получить прямоугольный фрагмент матрицы.
begin
var a := Matr(
[1,2,3,4,5],
[6,7,8,9,10],
[11,12,13,14,15],
[16,17,18,19,20]
);
a[1:3,2:4].Print;
end.
Результат:
8 9
13 14
Срез столбца
Срез a[:,j] возвращает столбец матрицы с индексом j в виде одномерного массива.
begin
var a := Matr(
[1,2,3],
[4,5,6],
[7,8,9]
);
a[:,1].Print;
end.
Результат:
2 5 8
Срез строки
Срез a[i,:] возвращает строку матрицы с индексом i в виде одномерного массива.
begin
var a := Matr(
[1,2,3],
[4,5,6],
[7,8,9]
);
a[2,:].Print;
end.
Результат:
7 8 9
Массив массивов
Массив массивов имеет тип array of array of T. Каждый его элемент является отдельным одномерным массивом.
По структуре он похож на матрицу.
begin
var a := [
[1,2,3,4],
[5,6,7,8],
[9,10,11,12]
];
a[1][1] := 666;
a.Println;
end.
Результат:
[1,2,3,4] [5,666,7,8] [9,10,11,12]
Преобразование матрицы в массивы строк и столбцов
Свойство Rows возвращает строки матрицы в виде массива одномерных массивов, а Cols — возвращает столбцы матрицы в виде массива одномерных массивов.
begin
var a := MatrRandomInteger(3,4);
a.Println;
var rows := a.Rows;
rows.Println;
var cols := a.Cols;
cols.Println;
end.
Результат:
60 95 90 5
46 30 14 29
58 51 25 59
[60,95,90,5] [46,30,14,29] [58,51,25,59]
[60,46,58] [95,30,51] [90,14,25] [5,29,59]
Матрица из массива массивов
Функция MatrByRow создаёт матрицу по строкам из массива массивов, а функция MatrByCol — создаёт матрицу по столбцам из массива массивов.
begin
var a := [
[1,2,3,4],
[5,6,7,8],
[9,10,11,12]
];
a.Println;
var m := Matr(a);
m.Println;
m := MatrByCol(a);
m.Println;
end.
Результат:
[1,2,3,4] [5,6,7,8] [9,10,11,12]
1 2 3 4
5 6 7 8
9 10 11 12
1 5 9
2 6 10
3 7 11
4 8 12