我所说的二维数组包含诸如
之类的值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)。
答案 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
这可能写得更优雅,但你明白了......