Опубликован: 01.11.2012 | Уровень: для всех | Доступ: платный | ВУЗ: Томский государственный университет систем управления и радиоэлектроники
Лекция 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



