Томский государственный университет систем управления и радиоэлектроники
Опубликован: 01.11.2012 | Доступ: свободный | Студентов: 651 / 76 | Длительность: 06:01:00
Лекция 4:

Массивы

< Лекция 3 || Лекция 4: 1234 || Лекция 5 >

Трехмерные массивы


Объявление и инициализация

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 не равносилен оператору цикла

  1. В цикле оператор присваивания выполняется при каждом вызове.
  2. В 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
    
< Лекция 3 || Лекция 4: 1234 || Лекция 5 >