Fortran过滤二维数组

时间:2015-07-24 08:04:51

标签: arrays matrix fortran

我所说的二维数组包含诸如

之类的值
1   2326
1   2331
1   2328
1   2323
2   2404
2   2398
2   2401
2   2403
3   2408
3   2401
3   2408
3   2401

我想对所有具有相同ID的元素进行操作,例如:

program filter_2d
    integer(1000, 1000) :: my_array
    integer :: id

    ...

    print *, any(my_array(1, :), id)
end program filter_2d

任何只是返回true。如何过滤具有(i,1)== 2的行?例如?

作为一个附带问题,我应该使用数组还是只使用具有id整数和数组的自定义类型来保存其余值(数组要大得多,如10000x10000)。

1 个答案:

答案 0 :(得分:1)

最简单的方法是循环和if语句:

program filter_2d
  integer             :: my_array(3, 3)
  integer, parameter  :: id = 2

  my_array = reshape( [ 1, 2, 2, 2, 3, 4, 5, 6, 7 ], [3,3] )

  do i=1,size(my_array,1)
    if ( my_array(i,1) == id ) print *, my_array(i, :)
  enddo ! i
end program filter_2d

特别是如果尺寸变大,我会使用数组而不是派生类型。 OOP方法总是需要考虑计算开销。

根据经验,我总是使用尽可能简单的结构,如果没有其他选项,则只选择派生类型。当然,这仅适用于代码的数字部分。对于包括I / O和预处理的模拟的组织,采用OOP范例通常是有益的。

您还可以设置索引集并对其进行操作:

program filter_2d
  integer             :: my_array(3, 3)
  integer, parameter  :: id = 2

  integer             :: idx( size(my_array, 1) )
  integer             :: nMatch

  my_array = reshape( [ 1, 2, 2, 2, 3, 4, 5, 6, 7 ], [3,3] )

  nMatch = 0
  do i=1,size(my_array,1)
    if ( my_array(i,1) == id ) then
      nMatch = nMatch + 1
      idx(nMatch) = i
    endif
  enddo ! i

  print *, my_array(idx(:nMatch),:) 
end program filter_2d

这可能写得更优雅,但你明白了......