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的解决方案根本没有问题。。。