Матрицы • Матрица – это тип данных, которому соответствует таблица. • При работе с матрицами оперируют понятиями имя матрицы, столбец, номер столбца, строка, номер строки, элемент, размер матрицы, например 3 х4. • Все элементы матрицы имеют один и тот же тип. • Для идентификации элементов матрицы используют два индекса – номер строки и номер столбца. Например, matrix[2, 3]
Определение типа для матрицы С точки зрения формального описания, матрица - это массивов или двумерный массив type TMatr 4 x 3 = array[1. . 4] of array[1. . 3] of Integer; Tmatr 3 x 2 = Array[1. . 3, 1. . 2] of Integer;
Компонент String. Grid Cells[Col, Row]
Свойство Что определяет Name Имя компонента Row. Count Количество строк таблицы Col. Count Количество колонок Fixed. Cols Количество зафиксированных колонок таблицы в левой части таблицы. При горизонтальной прокрутке таблицы остаются на месте. Количество зафиксированных строк в верхней части таблицы. Fixed. Rows Default. Row. Height Высота строк таблицы Default. Col. Width Ширина колонок Options. Go. Editing True – редактирование ячеек разрешено, False – запрещено
Ввод матрицы из TString. Grid procedure get. Matr. From. Grid(var m: TMatr. Int 10 x 10; var n. Row, n. Col: integer; grid: TString. Grid); var i, j: integer; begin n. Row: =grid. Row. Count; n. Col: =grid. Col. Count; for i: =1 to n. Row do for j: =1 to n. Col do m[ i, j ]: =str. To. Int(Trim(grid. Cells[ j-1, i -1])); end;
Вывод матрицы в TString. Grid procedure show. Matr. In. Grid(const m: TMatr. Int 10 x 10; n. Row, n. Col: integer; grid: TString. Grid); var i, j: integer; begin grid. Col. Count: =n. Col; grid. Row. Count: =n. Row; for i: =1 to n. Row do for j: =1 to n. Col do grid. Cells[ j -1, i -1]: =format('%3 d', [ m[ i, j ] ]); end;
Задачи тотальной обработки матриц • • Ввод-вывод матриц. Заполнение матрицы случайными числами. Поиск суммы всех элементов матрицы. Поиск максимального или минимального элемента в матрице. • Умножение матрицы на число. • Сложение двух матриц одинакового размера. • Суммирование по строкам или столбцам.
Реализация тотальной обработки Тотальная обработка организуется с помощью двух вложенных циклов for…to…do, параметрами которых являются индексы матрицы. При обработке матрицы по строкам, внешний цикла организуется для первого индекса, При обработке матрицы по столбцам, первый индекс должен изменяться во внутреннем цикле.
Примеры тотальной обработки
Создание матрицы случайных целых чисел procedure create. Rnd. Matr(var m: TMatr. Int 10 x 10; n. Row, n. Col, modul: integer); var i, j: integer; begin Randomize; for i: =1 to n. Row do for j: =1 to n. Col do m[i, j]: =random(modul); end;
Вывод матрицы в компонент TMemo procedure show. Matr. In. Memo (const m : TMatr. Int 10 x 10; n. Row, n. Col : integer; memo: TMemo); var i, j: integer; s: string; begin memo. Clear; for i: =1 to n. Row do begin s: =''; for j: =1 to n. Col do s: =s+format('%4 d', [ m[ i, j ] ]); memo. Lines. Append(s); end;
Ввод матрицы из компонента TMemo Procedure get. Matr. From. Memo(var m: TMatr. Int 10 x 10; var n. Row, n. Col : integer; memo: TMemo); var i, j: integer; a: TArray 100; begin n. Row: = memo. Lines. Count; for i: =1 to n. Row do begin get. Array. From. Str(a, n. Col, memo. Lines[i-1]); for j: =1 to n. Col do m[i, j]: =a[j]; end;
Поиск минимального procedure find. Min(var m: TMatr. Int 10 x 10; n. Row, n. Col: integer; var min, x, y: integer); var i, j : integer; begin x: =1; y: =1; min: =m[x, y]; for i: =1 to n. Row do for j: =1 to n. Col do if m[ i, j ] < min then begin min : = m[ i, j]; x : = i; y : = j; end
Массив сумм столбцов function sum. Col(var m: TMatr. Int 10 x 10; n. Row, n. Col: integer): Tint. Array 100; var i, j, sum: integer; begin for j: =1 to n. Col do begin sum: =0; for i: =1 to n. Row do sum: =sum+ m[ i, j]; result[ j ] : = sum; end
Выборочная обработка матриц • При выборочной обработке матрицы могут решаться те же задачи что и при тотальной, но только для части элементов матрицы. • Выборочную обработку можно свести к тотальной обработке, но обрабатывать только те, которые удовлетворяют условиям задачи. • Но лучше попытаться организовать перебор только нужных элементов.
Варианты перебора элементов • Элементы главной диагонали квадратной матрицы. • Элементы вспомогательной диагонали квадратной матрицы. • Элементы некоторого столбца или строки матрицы. • Элементы матрицы, расположенные по ее кромке. • Элементы квадратной матрицы, расположение которых соответствует расположению белых или черных клеток шахматной доски.
Перебор по главной диагонали На главной диагонали номера строки и столбца совпадают. Поэтому в цикле достаточно изменять только один индекс. … sum: =0; for i: =1 to n. Row do sum: =sum+matr[ i , i ]; …
Перебор по второй диагонали Хотя номера строки и столбца не совпадают, но они связаны соотношением i + j = n. Col + 1 … sum: =0; for i: =1 to n. Row do sum: =sum+matr[ i , n. Row+1 -i ]; …
Перебор по кромке прямоугольной матрицы … sum : = 0; for j: =1 to n. Col do sum : = sum+m[ 1, j ] + m[ n. Row, j ]; for i: =2 to n. Row -1 do sum: = sum + m[ i, 1] + m[ i, n. Col];
Перебор по кромке квадратной матрицы … sum: =0; for i: =1 to n-1 do sum : = sum + m[1, i ] + m[ i, n] + m[ n, n+1 - i ] + m[ n+1 - i, 1]; …
Перебор по белым клеткам … sum : = 0; for i: =1 to n. Row do begin j : = (j +1) mod 2 +1; while j <= n. Col do begin sum : = sum+m[ i, j ]; j: =j+2; end;
Перестановки элементов в матрицах • Транспонирование матрицы (поворот вокруг главной диагонали). • Поворот вокруг вспомогательной диагонали. • Поворот вокруг горизонтальной оси. • Поворот вокруг вертикальной оси.
Реализация обменов • Для решения перечисленных задач требуется двойной цикл. • Внешний цикл обычно организуется по номерам строк или столбцов, иногда, за исключением первого или последнего. • Внутренний цикл обеспечивает перебор только тех элементов, которые расположены с одной стороны от оси поворота. • Тело цикла содержит операторы, которые обеспечивают обмен значениями между текущим элементом матрицы и симметричным ему.
Транспонирование матрицы X 2, 1 3, 1 1, 2 1, 3 X X 3, 6 X j, i X 6, 3 X X i, j X X X
Другое транспонирование X 2, 2 X 3, 4 X X X i, j X 7, 3 X X 7, 8 8, 4 n+1 -j, n+1 -i 9, 9
Переворот вокруг горизонтали 2, 1 3, 4 i, j 5, 8 6, 8 n+1 -i , j 8, 4 9, 1
Переворот вокруг вертикали 2, 2 2, 9 4, 4 i, j 4, 7 i , n+1 -j 8, 3 8, 8
Линия симметрии Главная диагональ Внешний цикл Внутренний цикл for i: =2 to n. Row for j: =1 to i-1 Вспомо- for i: =1 to гатель-ная n. Row -1 диагональ Горизон- for i: =1 to тальная n. Row div 2 ось Вертикальная ось for i: =1 to n. Row Индексы элемента текущий симметричный [ i, j ] [ j, i ] for j: =1 to n. Col - i [ i, j ] [n. Row+1–j, n. Col+1– i] for j: =1 to n. Col [ i, j ] [n. Row+1–i, j] for j: = 1 to n. Col div 2 [ i, j ] [ i, n. Col+1 – j]
Переворот вокруг вертикальной … for i: =1 to n. Row do for j: =2 to n. Col div 2 do begin buf : = m[ i, j ]; m[ i, j ] : = m[ i, n. Col+1 - j]; m[ i, n. Col+1 - j] : = buf; end; …


