Написание программы на языке ФОРТРАН, реализующей требуемые действия над матрицами произвольной размерности: умножение ленточной симметричной матрицы на вектор (Лабораторная работа № 3), страница 4

      DIMENSION d_mat(max_i-1,max_j),diag(max_j)

      OPEN(2,FILE='matrix.txt',ERR=20)

      d=0     

      l=1

      DO 16 j=1,max_j,1               

         DO 15 i=1,max_j,1                      

            IF (i.EQ.j) WRITE(2,9,ERR=21) diag(j)

            IF (i.GT.j) THEN              

               IF (i.GE.j+max_i) THEN

                  WRITE(2,9,ERR=21) d

               ELSE

                  WRITE(2,9,ERR=21) d_mat(j-i+max_i,i)

               ENDIF

            ENDIF

            IF (i.LT.j) THEN

               IF (j.GE.i+max_i) THEN

                  WRITE(2,9,ERR=21) d

               ELSE

                  WRITE(2,9,ERR=21) d_mat(i-j+max_i,j)

               ENDIF

            ENDIF           

15          CONTINUE

16       WRITE(2,8,ERR=21)  

      GOTO 17

8     FORMAT( )

9     FORMAT(\E12.4,';')

20    PRINT *,'Nevozmozhno otkrit fail'

      er=1

      GOTO 17

21    PRINT *,'O6ibka zapisi'

      er=1     

17    CLOSE(2)

      END

      PROGRAM main_print

      COMMON /error/ er

      COMMON /size/ max_i,max_j

      COMMON /array/ a(200000000)

      CALL input_matrix

      IF (er.NE.0) GOTO 25

      CALL printer(a(1),a((max_i-1)*max_j+1))

      IF (er.NE.0) GOTO 25

      PRINT *,'programma vipolnena uspe6no, rezultat v faile'      

25    PAUSE

      END 

5.  Тесты

1)  обычная матрица

в плотном формате:   

1  0  1  0  0  0

0  1  0  1  0  0

1  0  1  0  1  0

0  1  0  1  0  1

0  0  1  0  1  0

0  0  0  1  0  1

матрица:       диагональ:             вектор:         результат:

3 6                      1                             6                     4

0 1                      1                             1                     6

0 1                      1                             2                     9

0 1                      1                             3                    12

0 1                      1                             4                     8

0 0                      1                             5                    10

0 0                                                     6

2)  Переполнение памяти. Данные хранятся в массиве из 200 000 000 элементов. N*L элементов для хранения матрицы AL,  N элементов для хранения вектора, N элементов для хранения результата перемножения

Если N*L+2N превышает 200 000 000, возникает переполнение памяти.

“programma ne vipolnena”

3)  Некорректность данных. Если щирина ленты больше размера матрицы, или если размер матрицы = 0 ,то «programma ne vipolnena»

4)  тестирования с использованием генератора на матрицах больших размерностей прошло успешно

6.  Исследование зависимости времени уменожения матрицы на вектор и времение считывания от размера записи и размерности матрицы

Ширину ленты взяли равной N/10

N

Время умножения матрицы на вектор, ms

Время считывания файла с прямым доступом(мс). Размер записи (байт), ms

4

8

16

32

64

10000

800

18950

10310

7110

4330

3360

20000

1710

36560

20500

12560

8670

6690

30000

2600

54710

30830

18950

12980

10000

40000

3510

72950

25240

25240

17250

13440

При увеличении размера записи считывание проходит быстрее. Это можно объяснить тем, что программа реже обращается к медленной внешней памяти и за одну итерацию получает больше значений переменных, что позволяет  быстрее выполнить нужные действия.