Вы не можете иметь смешанные типы (integer
и real
) в одном и том же массиве в Фортране, поэтому я предполагаю, что все данные real
в 2-мерном массиве:
program split
implicit none
real, allocatable :: a(:, :), b(:, :)
integer :: i, ids = 10
integer, allocatable :: id(:), seq(:)
a = reshape([real :: 1, 5, 1, 7, 0.5, &
& 2, 4, 5, 6, 0.1, &
& 1, 9, 3, 4, 0.6, &
& 2, 8, 7, 2, 0.2], [5, 4])
seq = [(i, i = 1, size(a, 2))]
do i = 1, ids
print*, "i = ", i
! here we are creating a vector with all the line indices that start with i
! e.g. for i = 1 we get id = [1, 3], for i = 2 we get [2, 4], for i = 3 we get [], ...
id = pack(seq, a(1,:) == i)
! here we use a Fortran feature named vector-subscript
b = a(:, id)
print*, b
end do
end
Если вы хотите, чтобы первый столбец (или любой столбец) был integer
, вы можете объявить его как отдельный массив и использовать те же векторные индексы, чтобы собрать нужные строки.