如何在 Fortran 中将一堆大型可分配向量组合到一个数组中?我想避免使用 reshape
进行复制和 reshape ,因为数组很大。我想要达到的效果就像Fortran的等价
,举例说明:
program test_equiv
integer x(10), y(10), z(10), xyz(10,3)
equivalence (x, xyz(1,1))
equivalence (y, xyz(1,2))
equivalence (z, xyz(1,3))
x = 1
y = 2
z = 3
! and we can use just normal array syntax
print *, xyz(3,:)
end program
但是,这不适用于可分配数组。如果是关于访问矩阵向量,则可以通过指针轻松实现。但是如何将向量组合成二维数组呢?到目前为止,我只遇到了有问题的指针数组:
program test_arofpntrs
implicit none
integer :: i
integer, allocatable, target :: xs(:), ys(:), zs(:)
type t_p_xs
integer, pointer :: p_xs(:)
end type t_p_xs
type(t_p_xs), allocatable :: coords(:)
allocate(coords(3), xs(10), ys(10), zs(10))
xs = 1
ys = 2
zs = 3
coords(1) % p_xs => xs
coords(2) % p_xs => ys
coords(3) % p_xs => zs
print *, coords(1) % p_xs(:)
! this fails:
!print *, coords(:) % p_xs(1)
end program
这很难看,并且无法访问 xs(i)、ys(i)、zs(i)。是否可以在没有副本的情况下做我想做的事情?
最佳答案
如果您从单独的一维数组开始,这是不可能的。可分配的数组可以位于内存中的任何位置。尽管 Fortran 数组不必是连续的,但必须有某种步幅系统。
! this fails:
!print *, coords(:) % p_xs(1)
被Fortran标准禁止,因为不能简单地计算出下一个元素的地址。一维数组甚至不能保证具有相同的长度。
此外,reshape
本身并不一定效率低下,它可能只是在语法上有助于索引,但根本不接触数据。
指针是一个很棒的工具,可能会有所帮助。您必须以不同的方式使用一维数组。例如,分配一个长的一维数组,并为其中的一部分分配一维指针,并为整体分配一个二维指针,或者反过来更好:
real,allocatable,target :: xyz(:,:)
real,pointer :: x(:),y(:),z(:)
allocate(xyz(1:10,1:3))
x => xyz(:,1)
y => xyz(:,2)
z => xyz(:,3)
甚至其他顺序的索引也是可能的,即,xyz(3,10); x => xyz(1,:)
.
你也可以这样做
long1D(1:size(xyz)) => xyz
但请注意,这是 Fortran 2008 朝此方向的功能(否则为 2003)。
关于arrays - Fortran:将可分配向量组合在数组中,无需复制和 reshape ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13075194/