Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
35
Добавлен:
23.03.2015
Размер:
153.6 Кб
Скачать

Представление матриц.

Последовательная структура данных - это такая структура, в которой обработка и расположение элементов выполняется последовательно. К данной структуре относятся двумерные массивы (матрицы). Доступ к элементам массива вычисляемый (по индексам).

, , (1)

Сплошное представление массивов в памяти:

Машина представляет в виде линейного способа (последовательно). С помощью формулы приведенного индекса мы можем вычислить месторасположение в линейном виде.

Определение: приведенный индекс – порядковый номер элемента от начала массива представления вектора памяти.

Линейное представление матрицы возможно

  • По столбцам;

(2)

Формула приведенного индекса имеет вид:

(3)

Таким образом адрес , где

Существует обратная задача: как по приведенному индексу получить индексы . Для нахождения приведенный индекс делим нацело на и к результату прибавляем 1.

  • По строкам;

(4)

Формула приведенного индекса имеет вид:

(5)

Аналогично линейному представлению по столбцам определяем индексы .

Представление разреженных матриц.

Определение: Разреженная матрица –матрица, в которой количество не нулевых элементов менше нулевых.

Все представления, в том числе и представление разреженных матриц состоит из дескриптора и тела (рис.1).

Рис.1 Представлення об’єкту.

Дискриптор содержит общие свойства и дополнительные сведения для оптимальной реализации объекта.

Например: необходимо описать объект- группа студентов. В качестве дискриптора может выступать: шифр группы, куратор.Обычно дескриптор – это запись, которая содержит связь с телом.

Существует два способа представления тела:

  • Ограниченное (на базе массива);

  • Неограниченное (на базе списка).

Зачастую в качестве тела выступают ограниченное представление.

Рассморим представление данных.

Існує два способи представлення даних:

  • За допомогою масиву;

  • За допомогою списку.

Виды представления разреженных матриц:

А) Нижняя треугольная матрица

Для представлення нижньої треугольної матриці необхідно представити її у

лінійному вигляді. Нехай тіло – вектор не нульових елементів на та нижче головної діагоналі.

Тоді представлення матриці має вигляд:

Функция абстракции есть:

a11

a21 a22

A: rep  a31 a32 a33

. . .

an1 an2 an3 . . . ann

Наступним кроком реалізації є необхідність системи типів. Наприклад: зробимо це за допомогою Turbo Pascal.

Type

Intarray=array[1..65520div sizeof(integer)] of integer;

TMATR=record

n: word;

tbody:intarray;

end;

PMATR= TMATR;

Наступним кроком є опис інтерфейсу типу.

Запишемо операції для роботи з матрицею.

Function Create (n:word):PMATR; // створення матриці

Function Getel (M:PMATR;i,j:word):integer; // отримання елементу матриці

Procedure Destroy(var M: PMATR)//знищення матриці

Зауваження: функція Create повинна працювати за максимумом тобто 65520div sizeof(integer).

Всі ці пункти повинні бути відображені в окремому модулі роботи з матрицею.

Б) Разреженные матрицы:

Способ 1. Упакованный способ хранения запоминаются только ненулевые элементы

i j aij

Если  - число ненулевых элементов, то необходимо 3 ячеек. Ясно, что 3 << n2 , чтобы оправдать затраты на хранение индексов. При хранении в упакованной форме должна быть каким-то образом предусмотрена возможность добавления новых ненулевых элементов в различные столбцы (или строки) матрицы A.

  1. Использование связанных списков.

Каждому элементу aij  0 соответствует в памяти запись. Записи j-ого столбца матрицы. Каждая запись будет представлять собой упорядоченную тройку

i a p , где

i – номер строки;

a – значение элемента матрицы;

p – указатель на следующий ненулевой элемент.

Представление такой матрицы будет состоять из массива голов списков ненулевых элементов по столбцам и списка троек <i, a, p> для каждого ненулевого элемента столбца.

Эту схему можно использовать в перевернутом виде, т.е. по строкам. Тогда массив голов списков будет хранить указатели на списки ненулевых элементов строк.

Иногда полезны упаковки, не использующие связанных списков. Для них требуется меньшая память, но добавление и удаление ненулевых элементов требует сдвига элементов массива. Ниже описываются четыре такие схемы.

  1. Опис розреженої матриці.

Рис.2 Опис розреженої матриці за упакованою схемою.

Зауваження: Список при описі матриці може бути упорядкованим та не упорядкований. Рекомендують зберігати в упорядкованому списку за номерами стовбців.

  1. Опис типу на мові програмування.

type

PNode=Node;

Node=record

j: word;

el: real;

next:PNode;

end;

Ptrarray=array[1..65520divsizeof(PNode)] of PNode;

Matr=recordо

n,m:word;

Pbody: Ptrarray;

end;

PMatr=Matr;

Щоб приступити до реалізації, перше, що необхідно зробити- описати функцію абстракції та інваріант представлення.

Функція абстракції є: Типічна прямокутна матриця є:

Інваріант представлення- вимога до правильного представлення

об’єкту.

В нашому випадку

/* функція інваріант представлення є:

<розмір вектору & < в списку для всіх >&<в списку для різних вузлів для всіх > */

Після даного опису можна описувати інтерфейс об’єкту.

б) Использование одномерных массивов (векторов)

Схема I

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

< Номер строки, Значение элемента >

Нуль в первой ячейке означает конец данного столбца. Вторая ячейка в этом случае содержит номер следующего столбца. Нули в обеих ячейках указывают на конец массива, хранящего матрицу. Число ячеек, необходимых для хранения матрицы, рассчитывается по формуле

2 (n + τ +1)

Рассмотрим эту схему на примере матрицы

┌ ┐

│ 0 0 a13 0 0 │

│ a21 0 0 a24 0 │

A5 = │ 0 0 a33 0 0 │

│ a41 0 0 0 a45

│ 0 a52 0 0 0 │

└ ┘

Эта матрица для которой τ = 7, n = 5 будет храниться в виде массива

(0, 1; 2, a21; 4, a41; 0, 2; 5, a52; 0, 3; 1, a13; 3, a33; 0, 4; 2, a24; 0, 5; 4, a45; 0, 0)

Всегда номер строки признак начала столбца признак конца

0 1 2 а21 4 а41 0 2 5 а52 0 0 0

Номер

столбца, представление I-го столбца

где есть

не нулевые элементы

Нумеруем пары для вычисления размера вектора:

ℓ=(n+1+r)-максимальный размер числа пар

r-должно храниться в образе матрицы или вычисляться, но может храниться и в

дискрипторе.

Описываем тип: (В этом случае возникает проблема в том,что ji-целое, aij1-может быть любым,поэтому использование значений этих пар разное при этом используется тип запись с вариантами)

type

Para=record

case K: word of тип i-й пары , она может быть 0 ji

0: (j:word); i aiji

else (val: real); (_ _ _ _ _; _ _ _ _ _ );

end;

Схема II

Информация о данной матрице хранится в трех массивах: VE – значения ненулевых элементов, RI –индексов строк и CIP – указателей индексов столбцов. Элемент RI(α) содержит индекс строки α-ого элемента VE - VE(α). Если первый ненулевой элемент β-ого столбца данной матрицы размещается в VE(tβ), то tβ хранится в β-ом элементе CIP, т.е. CIP(β) = tβ. Очевидно, VE и RI состоят из τ элементов, а CIP из n элементов. Следовательно эта схема требует общее число в 2τ + n ячеек.

Матрица A5 будет храниться следующим образом:

VE = (a21, a41, a52, a13, a33, a24, a45)

RI = (2, 4, 5, 1, 3, 2, 4)

CIP = (1, 3, 4, 6, 7)

Вышеизложенной схемой легко пользоваться. Например, a33 может быть найдено следующим образом. Так как CIP(3) = 4, то RI(4) даст индекс строки первого ненулевого элемента третьего столбца. Если a33 ≠ 0, то RI(4) или один из следующих за ним элементов RI предшествующих первому ненулевому элементу четвертого столбца, должен быть равен 3. В нашем случае RI(5) = 3, т.к. VE(5) содержит a33.

Схема III

Каждому ненулевому элементу данной матрицы однозначно ставится в соответствие целое число λ(i, j) вида

λ(i, j) = i + (j – 1)n, aij ≠ 0

Хранение ненулевых элементов обеспечивается двумя массивами: VE – значений ненулевых элементов и LD, в каждом из которых содержится τ элементов. В LD(α) находится λ(i, j), соответствующее aij из VE(α), где α = 1,2, …, τ.

Матрица A5 хранится в виде

VE = (a21, a41, a52, a13, a33, a24, a45)

LD = (2, 4, 10, 11, 13, 17, 24)

Элементы хранятся по столбцам.

PVE-элементы;

PLD-приведенный индекс элемента в сплошном представлении по столбцам.

Исходная матрица может быть восстановлена по этой схеме хранения следующим образом. В соответствии с данным выше определением для λ(i, j) является очевидным, что j есть наименьшее целое, большее или равное λ(i, j)/n и i = λ(i, j) – (j -1)n.

Например, если λ(i, j) = LD(5) = 13, тогда λ(i, j)/n =13/5 и наименьшее целое число большее или равное λ(i, j)/n будет 3 и i = λ(i, j) – (j -1)n = 13 – 10 = 3.

Схема IV

Если A – симметричная матрица, в которой для всех i ≥ j aij = 0, i – j > θi, где θi намного меньше n и в общем случае может иметь различные значения для каждого i, то такая матрица называется симметричной ленточной матрицей с локально изменяющейся шириной ленты.

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

VE – значения ненулевых элементов и

PD – положение диагональных элементов в массиве VE.

Для каждой строки в VE хранятся крайний левый ненулевой элемент и все следующие элементы, расположенные справа от него вплоть до диагонального включительно. Поэтому i-ая строка матрицы A требует θi + 1 ячеек для хранения и VE будет состоять из n

∑ θi + 2n ячеек для хранения матрицы A.

i=1

Например, пусть у нас имеется матрица

┌ ┐

│ a11 0 0 0 0 │

│ a21 a22 0 0 0 │

A5 = │ 0 a32 a33 0 0 │

│ 0 a42 0 a44 0 │

│ 0 a52 a53 0 a55

└ ┘

Тогда ее можно представить в виде

1 2 3 4 5 6 7 8 9 10 11 12

VE = (a11, a21, a22, a32, a33, a42, 0, a44, a52, a53, 0, a55)

PD = (1, 3, 5, 8, 12)

Элемент aij исходной матрицы может быть восстановлен следующим образом. Положение aij в VE определяется значением PD(i) – (i – j), если только PD(i) – (i – j) > PD(i – 1). Последнее условие означает, что aij не будет лежать влево от первого ненулевого элемента i-ой строки, иначе aij = 0 и не хранится в VE.

Например, чтобы найти элемент a53 в массиве VE, вычисляем PD(5) – (5 – 3) = 12 – 2 = 10 > 8 = PD(4) и, следовательно, a53 хранится в VE(10).

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

Диагональная блочная форма (BDF)

Матрица A определенная формулой

┌ ┐

│ A11 A12 … A1,p-1 A1,p

│ 0 A22 … A2,p-1 A2,p

A = │ 0 0 … │

│ … … … │

│ 0 0 … A p-1,p-1A p-1,p

│ Ap1 Ap2 … A p,p-1 A p,p

└ ┘

Имеет форму BDF, если для всех i ≠ j подматрицы Aij = 0 и все диагональные подматрицы Aij являются квадратными матрицами.

Треугольная блочная форма (BTF)

Матрица A задана в виде

┌ ┐

│ A11 A12 … A1,p-1 A1,p

│ 0 A22 … A2,p-1 A2,p

A = │ 0 0 … │

│ … … … │

│ 0 0 … A p-1,p-1A p-1,p

│ Ap1 Ap2 … A p,p-1 A p,p

└ ┘

причем подматрицы Aij = 0 для i ≠ p и подматрицы Aii, i = 1, 2, …, p являются квадратными матрицами, то говорят, что матрица A имеет треугольную блочную форму BTF.

Треугольная ленточная форма (BNTF)

Говорят, что матрица B имеет треугольную ленточную форму, если существует такое β 0 ≤ β ≤ n, где bij = 0 для всех i – j > β, и значение β не может быть уменьшено перестановками строк и столбцов матрицы B.

Пусть первый ненулевой элемент i-ой строки матрицы B находится в qi-ом столбце. Тогда определяем

β i = i- qi, qi ≤ i

β i = 0, qi > i

Очевидно, что если матрица B имеет форму BNTF, то max β i = β .

Заметим, что треугольная блочная форма (BTF), описанная в предыдущем разделе, является специальным случаем BNTF (β + 1 является в этом случае размером наибольшего диагонального блока матрицы B).

Ленточная форма (BF)

Определение. Матрица A, у которой aij = 0 при |i – j| > β, называется ленточной матрицей. Если к тому же aij ≠ 0 для всех |i – j| ≤ β, то она называется полной ленточной матрицей. Величина 2β + 1 называется шириной ленты.

Соседние файлы в папке Главы для пособия