Fortran の配列で大きな割り当て可能なベクトルの束をどのように組み合わせることができますか? reshape
配列が大きいため、コピーと再形成を避けたいと思います。私が実現したい効果はequivalence
、説明するために 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
ただし、これは割付け配列では機能しません。行列のベクトルにアクセスする場合は、ポインターを介して簡単に実装できます。しかし、2 次元配列でベクトルを組み合わせるにはどうすればよいでしょうか。今まで私は問題のあるポインタの配列にしか来ませんでした:
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) にアクセスできません。コピーなしでやりたいことをすることは可能ですか?