6CAD-CAE-22 Хранение матриц (1014141), страница 6
Текст из файла (страница 6)
Env(A)= )=i,j, 0 < i-j i (A)
То же самое можно записать посредством столбцовых индексов fi(A):
Env(A)=i,j, fi(A) j< i
Справедлива формула: Env(A)=
Диагональная схема хранения
Распространенным методом хранения симметричной матрицы А является так называемая диагональная схема хранения (Мартин 1971г)
Поддиагонали нижнего треугольника А, составляющие Band (A), вместе с главной диагональю хранятся по строкам в прямоугольном массиве с размерами N( (A)+1)
| a11 | _ | _ | _ | a11 | |||||||||
Cимметрично | a21 | a22 | _ | _ | a21 | a22 | ||||||||
0 | 0 | a33 | _ | 0 | 0 | a33 | ||||||||
a41 | 0 | 0 | a44 | a41 | 0 | 0 | a44 | |||||||
0 | a53 | a54 | a55 | 0 | a53 | a54 | a55 | |||||||
a63 | 0 | 0 | a66 | a63 | 0 | 0 | a66 | |||||||
0 | a75 | a76 | a77 | 0 | a75 | a76 | a77 |
Такая схема хранения очень проста и вполне эффективна, если i(A) не слишком меняется с изменением i.
Профильная схема хранения (схема Дженнингса 1966г)
Хранение производится с помощью двух массивов:
VE - значений ненулевых элементов,
PD - положений диагональных элементов в массиве VE.
Для каждой строки в VE хранится крайний левый ненулевой элемент и все следующие элементы, расположенные справа от него вплоть до диагонального включительно. Поэтому i-я строка матрицы А требует i+1 ячеек для хранения и VE будет состоять из элементов. Добавляя N элементов, необходимых для PD, получим общее количество в
ячеек для хранения А. Если лента является полной, т.е. ai j0 для всех i-j i при i>j, то
и требуемый объем памяти будет составлять
ячеек.
Для ранее рассмотренной матрицы:
1 | 2 | 3 | 4 | 5 | 6 | 7 | |||||||||||
1 | a11 | ||||||||||||||||
2 | a21 | a22 | |||||||||||||||
3 | a33 | ||||||||||||||||
4 | a41 | a44 | |||||||||||||||
5 | a53 | a54 | a55 | ||||||||||||||
6 | a63 | a66 | |||||||||||||||
7 | a75 | a76 | a77 |
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | |
VE | a11 | a21 | a22 | a33 | a41 | 0 | 0 | a44 | a53 | a54 | a55 | a63 | 0 | 0 | a66 | a75 | a76 | a77 |
1 | 2 | 3 | 4 | 5 | 6 | 7 | ||||||||||||
PD | 1 | 3 | 4 | 8 | 11 | 15 | 18 |
Элемент матрицы ai j исходной матрицы может быть восстановлен по этой схеме следующим образом. Положение ai j в VE определяется значением PD(i)-(i-j), если только PD(i)-(i-j)> PD(i-1). Последнее условие означает, что aij не будет лежать влево от первого ненулевого элемента i-ой строки, иначе ai j =0 и не хранится в VE.
Например, чтобы найти элемент a53 в массиве VE вычисляем
PD(5)-(5-3)=11-2=9>(PD(4)=8) и следовательно a53 хранится в VE(9).
Ещё примеры:
a51 : PD(5)-(5-1)=11-4=7 < PD(4), следовательно a51 = 0
a42 : PD(4)-(4-2)=8-2=6 > PD(3), следовательно a42 = PD(6)
a31 : PD(3)-(3-1)=4-2=2 < PD(2), следовательно a31 = 0
Главное преимущество этой схемы упаковки состоит в следующем. Если в процессе вычислений - (например, при исключении по методу Гаусса) создаются дополнительные ненулевые элементы только вправо от крайнего левого элемента каждой строки, то они могут запоминаться в VE без перемещений всех следующих за ними элементов.
Модификация профильной схемы хранения
Рассмотрим модификацию этой схемы, в которой дополнительные элементы хранятся отдельным вектором.
1 | 2 | 3 | 4 | 5 | 6 | 7 | |||||||||||
1 | a11 | ||||||||||||||||
2 | a21 | a22 | |||||||||||||||
3 | a33 | ||||||||||||||||
4 | a41 | a44 | |||||||||||||||
5 | a53 | a54 | a55 | ||||||||||||||
6 | a63 | a66 | |||||||||||||||
7 | a75 | a76 | a77 |
1 | 2 | 3 | 4 | 5 | 6 | 7 | ||||||
DIAG | a11 | a22 | a33 | a44 | a55 | a66 | a77 | |||||
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | |
ENV | a21 | a41 | 0 | 0 | a53 | a54 | a63 | 0 | 0 | a75 | a76 | |
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | |||||
XENV | 1 | 1 | 2 | 2 | 5 | 7 | 10 | 12 |
В схеме имеется основной массив ENV, содержащий элементы профиля (кроме диагональных) из всех строк матрицы. Для указания начала отрезка каждой строки используется вспомогательный индексный вектор XENV длины N+1. Чтобы добиться единообразия при индексировании, полагаем XENV (N+1) равным ENV (А)+1. Индексный вектор XENV дает возможность удобного доступа к любому ненулевому элементу. Отображение ENV(А) на множество 1,2,... ,ENV (А) задается таким образом: i,jXENV( i+1)-( i-j )
Другими словами, значение недиагонального элемента aij находится в ENV(XENV(i+1)-(i-j))
Пусть, например, нужно найти значение элемента a21.
Имеем: XENV( 2+1)-(2-1)=2-1=1 поэтому a21 хранится в ENV(1). Но попытка найти элемент a32 приведет к тому же результату, что говорит о необходимости какого-то дополнения к алгоритму.
Чаще всего используемой операцией является выделение профильного отрезка какой-либо строки. Это удобно делать, пользуясь следующим фрагментом для поиска элементов aij:
J1=XENV(I); J2=XENV(I+1)-1
IF(J2.LT. J1) GO TO 200