在Fortran中将矩阵分离为子矩阵

时间:2018-06-24 18:36:12

标签: arrays matrix fortran

假设我有一个二维数组,因此第一列仅由两个整数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语句将其添加到矩阵中。

1 个答案:

答案 0 :(得分:1)

在Fortran的同一数组中不能有混合类型(integerreal),因此我假设所有数据都是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,则可以将其声明为单独的数组,并使用相同的矢量下标收集所需的行。