假设我有一个二维数组,因此第一列仅由两个整数1和2组成。
1 5 1 7 0.5
2 4 5 6 0.1
1 9 3 4 0.6
2 8 7 2 0.2
我想从中分离出两个矩阵,以使每个矩阵的第一列包含相同的整数(因此,第一矩阵的第一列仅包含整数1,第二矩阵中的2表示相同)。 > 它将变成:
1 5 1 7 0.5
1 9 3 4 0.6
和
2 4 5 6 0.1
2 8 7 2 0.2
我不知道该如何开始。我正在考虑在开始时使用计数(好吧,因为我在第一列中有一个更大的矩阵,具有10个不同的整数),然后根据每个整数的计数数量来构造每个[sub]矩阵的维数。之后,我唯一想到的就是count(mask),如果值为true,则通过if语句将其添加到矩阵中。
答案 0 :(得分:1)
在Fortran的同一数组中不能有混合类型(integer
和real
),因此我假设所有数据都是2维数组中的real
:< / p>
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
,则可以将其声明为单独的数组,并使用相同的矢量下标收集所需的行。