Fortran 过滤一个二维数组
Fortran filter a two dimensional array
我正在谈论的二维数组包含
等值
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
任何 returns 正确。例如,我如何过滤具有 (i, 1) == 2 的行?
作为一个附带问题,我应该使用数组还是只使用具有 id 整数和一个数组来保存其余值的自定义类型(数组要大得多,例如 10000x10000)。
最简单的方法是循环和 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
这可能可以写得更优雅,但你明白了......
我正在谈论的二维数组包含
等值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
任何 returns 正确。例如,我如何过滤具有 (i, 1) == 2 的行?
作为一个附带问题,我应该使用数组还是只使用具有 id 整数和一个数组来保存其余值的自定义类型(数组要大得多,例如 10000x10000)。
最简单的方法是循环和 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
这可能可以写得更优雅,但你明白了......