Loops Fortran数组组合
例如,假设我有一个数组Loops Fortran数组组合,loops,fortran,fortran90,Loops,Fortran,Fortran90,例如,假设我有一个数组A=(/2,5,6,11/)。我想得到用于计算的组合(2,5),(5,6),(6,11),(11,2)。基本上,它是(A(i),A(i+1)),但必须与数组中的第一个元素循环。如何在FORTRAN中设置它? 谢谢你的帮助 Chin试试这些: program simple implicit none integer,parameter :: A(4) = (/ 2,5,6,11 /) integer :: i, next ! Versio
A=(/2,5,6,11/)
。我想得到用于计算的组合(2,5)
,(5,6)
,(6,11)
,(11,2)
。基本上,它是(A(i),A(i+1))
,但必须与数组中的第一个元素循环。如何在FORTRAN中设置它?
谢谢你的帮助
Chin试试这些:
program simple
implicit none
integer,parameter :: A(4) = (/ 2,5,6,11 /)
integer :: i, next
! Version 1
do i=1,size(A)
next = i + 1
if (next > size(A)) next = 1
print *, A(i), A(next)
enddo ! i
! Version 2
do i=1,size(A)
print *, A(i), A( merge( 1, i+1, ( i==size(A) ) ) )
enddo ! i
! Version 3
do i=1,size(A)
print *, A(i), A( mod( i, size(A) ) + 1 )
enddo ! i
end program
试试这些:
program simple
implicit none
integer,parameter :: A(4) = (/ 2,5,6,11 /)
integer :: i, next
! Version 1
do i=1,size(A)
next = i + 1
if (next > size(A)) next = 1
print *, A(i), A(next)
enddo ! i
! Version 2
do i=1,size(A)
print *, A(i), A( merge( 1, i+1, ( i==size(A) ) ) )
enddo ! i
! Version 3
do i=1,size(A)
print *, A(i), A( mod( i, size(A) ) + 1 )
enddo ! i
end program
试试这些:
program simple
implicit none
integer,parameter :: A(4) = (/ 2,5,6,11 /)
integer :: i, next
! Version 1
do i=1,size(A)
next = i + 1
if (next > size(A)) next = 1
print *, A(i), A(next)
enddo ! i
! Version 2
do i=1,size(A)
print *, A(i), A( merge( 1, i+1, ( i==size(A) ) ) )
enddo ! i
! Version 3
do i=1,size(A)
print *, A(i), A( mod( i, size(A) ) + 1 )
enddo ! i
end program
试试这些:
program simple
implicit none
integer,parameter :: A(4) = (/ 2,5,6,11 /)
integer :: i, next
! Version 1
do i=1,size(A)
next = i + 1
if (next > size(A)) next = 1
print *, A(i), A(next)
enddo ! i
! Version 2
do i=1,size(A)
print *, A(i), A( merge( 1, i+1, ( i==size(A) ) ) )
enddo ! i
! Version 3
do i=1,size(A)
print *, A(i), A( mod( i, size(A) ) + 1 )
enddo ! i
end program
给定一个整数数组,如您的
A = (/ 2,5,6,11 /)
您可以为这些组合声明另一个数组
integer, dimension(:,:), allocatable :: b
分配
allocate(b(size(a),2))
然后填充它
b(:,1) = a
b(:,2) = cshift(a,1)
您会发现b
的行就是您所寻求的组合
当然,我使用了@mlt在评论中建议的方法。正如您所看到的,我没有显式地使用任何循环,也没有为任何数组元素的索引而烦恼
我对这种方法的性能没有任何要求,编译器很可能通过在幕后制作
a
的临时副本来实现这种方法。给定像您这样的整数数组
A = (/ 2,5,6,11 /)
您可以为这些组合声明另一个数组
integer, dimension(:,:), allocatable :: b
分配
allocate(b(size(a),2))
然后填充它
b(:,1) = a
b(:,2) = cshift(a,1)
您会发现b
的行就是您所寻求的组合
当然,我使用了@mlt在评论中建议的方法。正如您所看到的,我没有显式地使用任何循环,也没有为任何数组元素的索引而烦恼
我对这种方法的性能没有任何要求,编译器很可能通过在幕后制作
a
的临时副本来实现这种方法。给定像您这样的整数数组
A = (/ 2,5,6,11 /)
您可以为这些组合声明另一个数组
integer, dimension(:,:), allocatable :: b
分配
allocate(b(size(a),2))
然后填充它
b(:,1) = a
b(:,2) = cshift(a,1)
您会发现b
的行就是您所寻求的组合
当然,我使用了@mlt在评论中建议的方法。正如您所看到的,我没有显式地使用任何循环,也没有为任何数组元素的索引而烦恼
我对这种方法的性能没有任何要求,编译器很可能通过在幕后制作
a
的临时副本来实现这种方法。给定像您这样的整数数组
A = (/ 2,5,6,11 /)
您可以为这些组合声明另一个数组
integer, dimension(:,:), allocatable :: b
分配
allocate(b(size(a),2))
然后填充它
b(:,1) = a
b(:,2) = cshift(a,1)
您会发现b
的行就是您所寻求的组合
当然,我使用了@mlt在评论中建议的方法。正如您所看到的,我没有显式地使用任何循环,也没有为任何数组元素的索引而烦恼
我对这种方法的性能没有任何要求,编译器很可能通过在幕后制作
a
的临时副本来实现这种方法。到目前为止,你得到了什么?我会附加旋转(从第二个元素开始,然后是第一个元素或)副本并将其复制到2D。可能与换位相结合。或者类似的东西。嗯,我是编程新手。我知道I,I+1将得到组合,直到数组结束。但是我怎样才能将最后一个元素和第一个元素循环。也许是有什么?当然,你也可以在Fortran中使用mod操作,除了让数组从0或任何其他整数开始,你可以随时将索引移到你想要的mod空间,然后再移回。因此,在Fortran中使用基于mod的解决方案一点问题都没有……到目前为止,您得到了什么?我将附加旋转(从第二个元素开始,然后是第一个或多个元素)的副本并将其复制到2D。可能与换位相结合。或者类似的东西。嗯,我是编程新手。我知道I,I+1将得到组合,直到数组结束。但是我怎样才能将最后一个元素和第一个元素循环。也许是有什么?当然,你也可以在Fortran中使用mod操作,除了让数组从0或任何其他整数开始,你可以随时将索引移到你想要的mod空间,然后再移回。因此,在Fortran中使用基于mod的解决方案一点问题都没有……到目前为止,您得到了什么?我将附加旋转(从第二个元素开始,然后是第一个或多个元素)的副本并将其复制到2D。可能与换位相结合。或者类似的东西。嗯,我是编程新手。我知道I,I+1将得到组合,直到数组结束。但是我怎样才能将最后一个元素和第一个元素循环。也许是有什么?当然,你也可以在Fortran中使用mod操作,除了让数组从0或任何其他整数开始,你可以随时将索引移到你想要的mod空间,然后再移回。因此,在Fortran中使用基于mod的解决方案一点问题都没有……到目前为止,您得到了什么?我将附加旋转(从第二个元素开始,然后是第一个或多个元素)的副本并将其复制到2D。可能与换位相结合。或者类似的东西。嗯,我是编程新手。我知道I,I+1将得到组合,直到数组结束。但是我怎样才能将最后一个元素和第一个元素循环。也许是有什么?当然,你也可以在Fortran中使用mod操作,除了让数组从0或任何其他整数开始,你可以随时将索引移到你想要的mod空间,然后再移回。因此,在Fortran中使用基于mod的解决方案根本没有问题。。。