Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 如何通过展开一维向量来形成三维阵列_Arrays_Fortran_Gfortran - Fatal编程技术网

Arrays 如何通过展开一维向量来形成三维阵列

Arrays 如何通过展开一维向量来形成三维阵列,arrays,fortran,gfortran,Arrays,Fortran,Gfortran,一个常见的任务是形成一个数组,其中包含一个提升为幂的组合的变量。如果p是序列1,2,3,那么我可能需要k的X^{pk+pl},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) :

一个常见的任务是形成一个数组,其中包含一个提升为幂的组合的变量。如果p是序列1,2,3,那么我可能需要k的X^{pk+pl},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^{pk+pl}+pm},这是我在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均未涉及此问题。建议?

您可以按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

所有Fortran问题都使用tag。否则人们不会看到你的问题。你考虑过spreadspread…?@Alex338207不使用do循环的原因是该代码的真实版本对时间至关重要。你的建议1正是我想要的,多亏了你all@high-性能标记,感谢您的评论。事实上,arrayR应该被宣布为真实的。我修正了我的答案。@ClintonWinant,请注意,矢量化只在解释语言(如matlab、octave、python/numpy等)中有用。在编译语言(如Fortran)中,矢量化可能导致不必要的内存分配,并损害性能。但在这里,分散的数组仍然很小,所以这可能不是问题。