6CAD-CAE-22 Хранение матриц (1014141), страница 7
Текст из файла (страница 7)
DO 100 J= J1, J2
ЕLEMENT=ENV(J)
.........................................
100 СONTINUE
200 ........................
Пользуясь этим фрагментом, получим:
для a21: J1=1; J2=2-1=1, поэтому ELEMENT=ENV(1);
для a32: J1=2; J2=2-1=1 и т.к. J2 < J1, то a32 в схеме нет или , что то же самое, a32 =0;
Преимущество такого варианта в том, что он легко приспосабливается к случаю несимметричной матрицы А.
Обычная схема (Густавсон 1972, Шерман 1975).
В схеме имеется основной массив LN, содержащий все ненулевые элементы нижнего треугольного множителя. Отводится ячейка для хранения каждого логически ненулевого элемента в множителе. При этом ненулевые элементы, исключая диагональные, хранятся в LN столбец за столбцом. Предусмотрен сопровождающий вектор NZ, дающий строчные индексы ненулевых элементов. Кроме того, для указания начала ненулевых элементов каждого столбца в массиве LN (или, что всё равно, в массиве NZ используется индексный вектор XL. Диагональные элементы хранятся отдельно в векторе DIAG.
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 | |||||
NZ | 2 | 4 | 4 | 5 | 6 | 5 | 7 | 7 | ||||
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | ||||
LN | a21 | a41 | 0 | a53 | a63 | a54 | a75 | a76 | ||||
1 | 2 | 3 | 4 | 5 | 6 | 7 | ||||||
XL | 1 | 3 | 4 | 6 | 7 | 8 | 9 |
Если нужен доступ к ненулевому элементу aij, то нет никакого прямого метода для вычисления соответствующего индекса в массиве LNZ]. Приходится выполнять проверку индексов в NZSUB. С этой целью можно использовать приводимый ниже фрагмент программы. Заметим, что всякий элемент, не представленный в структуре данных, равен нулю.
K1=XL(J); K2=XL(J+1)-1
ATJ=0,0
IF (K2.LT.K1) GOTO 300
DO 100 K=K1,K2
IF (NZ(K).EQ.I ) GOTO 200
100 CONTINUE
GOTO 300
200 ATJ=LN(K)
300
Примеры нахождения aij
a41=? K1=1= XL(1)=1; K2= XL(2) -1=2;
K=1: NZ(1)=2 4;
K=2: NZ(2)=4 = 4, следовательно AIJ=LN(2);
a42=? K1=XL(2)=3; K2=XL(3) -1=4-1=3;
K=3: NZ(3)=4 = 4, следовательно AIJ=LN(3);
a43=? K1=XL(3)=4; K2=XL(4) -1=6 -1=5;
K=4: NZ(4)=5 4;
K=5: NZ(5)=6 4, следовательно AIJ= 0;
a61=? K1=XL(1)=1; K2=XL(2)-1=3-1=2;
K=1: NZ(1)= 2 6;
K=2: NZ(2)= 4 6, следовательно AIJ= 0;
a65=? K1=XL(5)=7; K2=XL(6)-1=8-1=7;
K=7: NZ(7)=7 6, следовательно AIJ= 0;
a63=? K1=XL(3)=4; K2=XL(4)-1=5;
K=4: NZ(4) = 5 6;
K=5: NZ(5) = 6 = 6, следовательно AIJ=LN(5);
a76=? K1=XL(6)=8; K2=XL(7)-1=9-1=8;
K=8: NZ(8) = 7 =7, следовательно AIJ=LN(8);
a64=? K1=XL(4)=6; K2=XL(5)-1=7-1=6;
K=6: NZ(6) = 5 6, следовательно AIJ= 0;
a72=? K1=XL(2)=3; K2=XL(3)-1=4-1=3;
K=3: NZ(3) = 4 7, следовательно AIJ= 0;
Компактная схема.
Эта схема является модификацией обычной, принадлежит Шерману (1975 г.) Идея состоит в уменьшении вектора NZ, что достигается удалением строчных индексов любого столбца, для которого они образуют финальную подпоследовательность индексов предыдущего.
Взамен на получаемое сжатие приходится вводить индексный дополнительный вектор XNZSUB, указывающий для каждого столбца начало его строчных индексов в массиве NZSUB
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 | |||||
LN Z | a21 | a41 | 0 | a53 | a63 | a54 | a75 | a76 | ||||
1 | 2 | 3 | 4 | 5 | 6 | |||||||
XL NZ | 1 | 3 | 4 | 6 | 7 | 8 | * | |||||
1 | 2 | 3 | 4 | 5 | 6 | 7 | ||||||
NZ SUB | 2 | 4 | 5 | 6 | 5 | 7 | * | |||||
1 | 2 | 3 | 4 | 5 | 6 | 7 | ||||||
XN ZSUB | 1 | 2 | 3 | 5 | 6 | 6 | 7 |
Теперь доступ к элементу, стоящему в позиции (i,j) осуществляется следующим образом:
K1=XLNZ ( j ); K2=XLNZ ( j +1) -1
AIJ=0,0
IF(K2.LT. K1)GO TO 300
KS=XNZSUB ( j )
DO 100 K=K1, K2
IF(NZSUB (KS).EQ.I)GO TO 200
KS=KS + 1
100 CONTINUE
GO TO 300
200 AIJ=LNZ (K)
300
Примеры нахождения aij
a31=? K1=XL(1)=1; K2=XL(2) -1=3 -1=2;