Томский государственный университет систем управления и радиоэлектроники
Опубликован: 01.11.2012 | Доступ: свободный | Студентов: 651 / 76 | Длительность: 06:01:00
Тема: Программирование
Специальности: Системный архитектор, Тестировщик
Теги:
Лекция 4:
Массивы
Трехмерные массивы
real A(10,20,30) real A(1:10,1:20,1:30) real, dimension :: A(10,20,30) integer, parameter :: Mi = 10, Mj = 20 real, dimension(Mi,Mj,Mi) :: A logical :: L(10,10,10) = .TRUE. character :: A(20,3,3) = 'Q'
использование сечений
A = 0 ! обнуление A(:,3:5,3:5) = 1 ! i A(3:5,:,3:5) = 1 ! j A(3:5,3:5,:) = 1 ! k
Многомерные массивы
real(8) :: S(8,5,6,6) = 0.5d0
complex(16) :: D5(3,4,5,6,6) = (0.0q0, 0.0q0)
Терминология
Ранг – число измерений массива
Размер – число элементов массива
Форма – ранг и протяженность вдоль каждого измерения
Согласованность – ранг, форма и размер совпадают
real A(3,5,8) ! ранг = 3 ! размер = 3х5х8 = 120 ! форма = (3,5,8) real С(-1:1,0:4,1:8) ! A и C согласованные
Динамические массивы
Размер массива задается во время работы программы
real A(10,20) ! статический массив real, allocatable :: B(:,:) ! динамический
Оператор allocate выделяет память под массив
Оператор deallocate освобождает память
Функция allocated выполняет проверку размещения массива
real, allocatable :: A(:,:) integer ERR_ALLOC ! создали массив 50х50 allocate(A(50,50), STAT=ERR_ALLOC) if (ERR_ALLOC/=0) stop "Allocation ERROR" print *, allocated(A) ! T deallocate(A) ! освободили память print *, allocated(A) ! F complex(16) A(-20:20,-30:30) complex(16), allocatable :: CHILD(:,:) integer ERR_ALLOC ! унаследовали границы и форму массива A allocate(CHILD, SOURCE=A, STAT=ERR_ALLOC) if (ERR_ALLOC/=0) stop "Allocation ERROR" CHILD(-20,30)=(11.0q0, 2.0q0) print *, allocated(CHILD) ! T deallocate(CHILD) ! освободили память
Оператор where
Эффективное выборочное присваивание( выгодная замена связки do---if)
where (логическое выражение-массив) операторы присваивания массивов elsewhere операторы присваивания массивов end where
program use_where integer :: A(7)=[1,-3,4,-5,-6,-7,0] where (A<0) A=-A elsewhere where (A==0) A=5 elsewhere A=A**2 endwhere end where write(*,"(7i4)") A ! 1 3 16 5 6 7 5 end
Оператор forall
Выборочное присваивание только для некоторой части массива.
forall (спецификация триплета, выражение маска) операторы присваивания массивов end forall
program use_forall integer :: A(20) = [1,0,0,0,0,0,1,2,3,4, & 0,0,0,0,0,0,1,1,1,1] forall (i = 1:10, A(i) == 0) A(i) = 5 end forall write(*,"(20i2)") A ! 1 5 5 5 5 5 1 2 3 4 0 0 0 0 0 0 1 1 1 1 end
Оператор forall не равносилен оператору цикла
- В цикле оператор присваивания выполняется при каждом вызове.
- В forall сначала полностью вычисляется правая часть оператора присваивания, а затем результат присваивается массиву.
program forall_NE_do integer, parameter :: M = 5 integer a(M) a = 1 do k = 2,M a(k) = a(k-1)+1 end do write(*,"(10(i4))") a ! 1 2 3 4 5 a = 1 forall (k = 2:M) a(k) = a(k-1)+1 write(*,"(10(i4))") a ! 1 2 2 2 2 end
Процедуры обработки массивов
Вычисления в массиве
ALL, ANY COUNT MAXLOC, MINLOC MAXVAL, MINVAL PRODUCT SUM
Преобразование
MERGE
Переформирование
RESHAPE
Справочные
ALLOCATED IS_CONTIGUOUS
Вектора и матрицы
DOT_PRODUCT MATMUL TRANSPOSE
Граница, форма, размер
LBOUND, UBOUND SHAPE, SIZE
Упаковка и распаковка
PACK UNPACK
Построение
SPREAD
Сдвиг массивов
CSHIFT, EOSHIFT