В Фортране функция «pack» — это мощный инструмент, позволяющий извлекать элементы из массива на основе заданной логической маски. Эта функция особенно полезна, когда вам нужно фильтровать или сжимать данные, выбирая только определенные элементы, соответствующие определенным критериям. В этой статье мы рассмотрим несколько методов реализации функции упаковки на Фортране, а также приведем примеры кода, иллюстрирующие каждый подход.
Метод 1: использование явного цикла
Один простой метод реализации функции упаковки — использование явного цикла. Этот подход включает в себя перебор исходного массива, оценку логического условия для каждого элемента и сохранение выбранных элементов в новом массиве. Вот пример:
program pack_example
implicit none
integer, dimension(10) :: source
integer, dimension(10) :: mask
integer, dimension(:), allocatable :: packed
integer :: i, count
! Initialize the source array and the logical mask
source = (/ (i, i=1, 10) /)
mask = MOD(source, 2) == 0
! Count the number of selected elements
count = count(mask)
! Allocate memory for the packed array
allocate(packed(count))
! Perform the packing operation
count = 0
do i = 1, 10
if (mask(i)) then
count = count + 1
packed(count) = source(i)
end if
end do
! Display the packed array
print*, packed
! Deallocate the packed array
deallocate(packed)
end program pack_example
Метод 2: использование оператора WHERE
Фортран предоставляет оператор WHERE, который упрощает реализацию функции упаковки. Оператор WHERE позволяет условно присваивать значения массиву на основе логической маски. Вот пример:
program pack_example
implicit none
integer, dimension(10) :: source
integer, dimension(10) :: mask
integer, dimension(:), allocatable :: packed
! Initialize the source array and the logical mask
source = (/ (i, i=1, 10) /)
mask = MOD(source, 2) == 0
! Perform the packing operation using WHERE statement
where (mask)
packed = source
end where
! Display the packed array
print*, packed
! Deallocate the packed array
deallocate(packed)
end program pack_example
Метод 3: использование внутренней функции PACK
Фортран также предоставляет внутреннюю функцию PACK, которая специально разработана для выполнения операций упаковки массива. Функция PACK принимает на вход исходный массив и логическую маску и возвращает новый массив, содержащий выбранные элементы. Вот пример:
program pack_example
implicit none
integer, dimension(10) :: source
integer, dimension(10) :: mask
integer, dimension(:), allocatable :: packed
! Initialize the source array and the logical mask
source = (/ (i, i=1, 10) /)
mask = MOD(source, 2) == 0
! Perform the packing operation using PACK function
packed = pack(source, mask)
! Display the packed array
print*, packed
! Deallocate the packed array
deallocate(packed)
end program pack_example
В этой статье мы рассмотрели три различных метода реализации функции упаковки в Фортране. Явный цикл, оператор WHERE и встроенная функция PACK предоставляют различные подходы к упаковке массива на основе логических масок. В зависимости от ваших конкретных требований и сложности операции упаковки вы можете выбрать наиболее подходящий метод. Используя эти методы, вы можете эффективно извлекать данные из массивов Фортрана и манипулировать ими.