让A
和I
成为维度为N的整数类型的数组。通常,I
是整数1:N
的排列。我想做A(1:N) = A(I(1:N))
。对于较小的N
,这可以正常工作,但Segmentation fault
很大时我得到了N
。
这是我实际做的一个例子:
integer N
integer,dimension(:),allocatable::A,I
N = 10000000
allocate(A(N))
allocate(I(N))
A = (/ (i,i=1,N) /)
I = (/ (N-i+1,i=1,N) /)
A(1:N) = A(I(1:N))
有更好的方法吗?
答案 0 :(得分:0)
似乎A(I(1:N))
是有效的语法,至少在我的测试中gfortran 4.8
,ifort 16.0
,pgfortran 15.10
)。一个问题是i
和I
是相同的,并且数组I
不能像你一样在暗示中使用。用j
替换它会产生一个为我运行的程序:
program main
implicit none
integer :: N, j
integer, allocatable, dimension(:) :: A, I
! -- Setup
N = 10000000
allocate(A(N),I(N))
A = (/ (j,j=1,N) /)
I = (/ (N-j+1,j=1,N) /)
! -- Main operation
A(1:N) = A(I(1:N))
write(*,*) 'A(1): ', A(1)
write(*,*) 'A(N): ', A(N)
end program main
至于为什么你会看到分段错误,我猜你在阵列大小变大时会耗尽内存。如果你仍然遇到麻烦,我建议如下。
您应该使用循环,例如
,而不是使用A(1:N) = A(I(1:N))
! -- Main operation
do j=1,N
Anew(j) = A(I(j))
enddo
A = Anew
这更易于阅读,也更容易调试。