如何通过传播1d向量形成3d数组

时间:2018-06-13 01:28:32

标签: arrays fortran gfortran

一项常见的任务是形成一个数组,其中包含一个基于幂组合的变量。如果p是序列1,2,3那么我可能想要X ^ {p(k)+ p(l)}用于k,l = 1,2,3这个MWE就是这样:

Program Main
use, intrinsic :: iso_c_binding
implicit none
integer(c_int) :: p(3)=(/0,1,0/)
integer(c_int) :: arrayP(3,3)
integer(c_int) :: krow,kcol
real(c_double) :: arrayR(3,3)
arrayP=spread(p,1,3)+spread(p,2,3)
do krow=1,3
   write(*,*)(arrayP(kcol,krow),kcol=1,3)
end do
arrayR=2.0d0**arrayP
! write array as three frames side by side
do krow=1,3
   write(*,fmt="(3(1pe10.2))")(arrayR(kcol,krow),kcol=1,3)
end do
End Program Main

输出结果为:

       0           1           0
       1           2           1
       0           1           0
1.00E+00  2.00E+00  1.00E+00
2.00E+00  4.00E+00  2.00E+00
1.00E+00  2.00E+00  1.00E+00

我需要将其扩展为3d数组,以便为​​k,l,m = 1,2,3找到X ^ {p(k)+ p(l)} + p(m)}扩展我在MWE中所拥有的东西:

integer(c_int) :: arrayP(3,3,3)
arrayP=spread(p,1,3)+spread(p,2,3)+spread(p,3,3)

不起作用,因为你不能在n + 1维以上扩展数组,其中n是p的等级,在这种情况下1.问题21010295或31573252都没有解决这个问题。建议?

1 个答案:

答案 0 :(得分:1)

您可以像francescalus所提到的那样进行链扩展,以获得3D阵列(见下文) 3个第一次写入产生所有序列1,2和3。 但是,你可能会考虑只有3个嵌套循环,这是我认为更容易阅读。

program test_spread
  implicit none
  integer :: a(3) = (/ 1, 2, 3 /)
  integer :: array(3,3,3)
  real    :: arrayR(3,3,3)
  integer :: i,j,k

  array = spread(spread(a, 2, 3),3,3)
  write(6,*) array(:,1,1)

  array = spread(spread(a, 1, 3),3,3)
  write(6,*) array(1,:,1)

  array = spread(spread(a, 1, 3),2,3)
  write(6,*) array(1,1,:)

  arrayR = 2.0**(                           &
     spread(spread(a, 2, 3),3,3) +           &
     spread(spread(a, 1, 3),3,3) +           &
     spread(spread(a, 1, 3),2,3))

  write(6,*) 'arrayR (1)',arrayR
  do k = 1,3
    do j = 1,3
      do i = 1,3
        arrayR(i,j,k) = 2.0**(a(i)+a(j)+a(k))
      end do
    end do
  end do

  write(6,*) 'arrayR (2)',arrayR

 end program test_spread