如何通过传播一维向量来形成三维数组
How to form a 3d array by spreading a 1d vector
一个常见的任务是形成一个数组,其中包含一个提升为幂组合的变量。如果 p 是序列 1,2,3 那么我可能想要 X^{p(k)+p(l)} for 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 均未解决此问题。建议?
您可以像 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
一个常见的任务是形成一个数组,其中包含一个提升为幂组合的变量。如果 p 是序列 1,2,3 那么我可能想要 X^{p(k)+p(l)} for 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 均未解决此问题。建议?
您可以像 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