Матрицы

Матрицы позволяют хранить данные в виде таблицы из строк и столбцов.

Создание матрицы

Двумерный динамический массив (матрица) имеет тип 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