gpt4 book ai didi

fortran - 数组值数组索引

转载 作者:行者123 更新时间:2023-12-02 12:17:12 24 4
gpt4 key购买 nike

我刚刚偶然发现编译器允许我使用整数数组作为其他数组的索引。例如:

  implicit none

real*8 :: a(3), b(2)
integer :: idx(2)

a=1.d0
idx=(/1,2/)

b = a(idx)
print*,shape(b)
print*,b
print*

end

鉴于这似乎适用于 gfortan 和 PGI 编译器,我想知道这是否是一种语言功能,而不是编译器让我使用的东西。如果比我更有知识的人可以评论这是否真的是一种语言功能,我将不胜感激。

如果是的话,如果有人能详细说明如何在多维情况下解释此类结构的确切语言规则,我将不胜感激,如下所示:

  implicit none
real*8 :: aa(3,3), bb(2,2)
integer :: idx(2)

do i=1,3 ; do j=1,3
aa(i,j) = 1.d0*(i+j)
enddo; enddo

bb=aa(idx,idx)
print*,shape(bb)
print*,bb

end

最佳答案

是的,确实如此。

Fortran 2008 标准的最终草案,ISO/IEC JTC 1/SC 22/WG 5/N1830,ftp://ftp.nag.co.uk/sc22wg5/N1801-N1850/N1830.pdf第 84 页上说

4.8 数组值的构造

...

6 如果 ac 值是数组表达式,则表达式元素的值按数组元素顺序 (6.5.3.2) 指定数组构造函数的相应元素序列。

示例

real, dimension(20) :: b
...

k = (/3, 1, 4/)
b(k) = 0.0 ! section b(k) is a rank-one array with shape (3) and
! size 3. (0.0 is assigned to b(1), b(3), and b(4).)

您可以直接从代码中看到的规则

implicit none
real*8 :: aa(3,3), bb(2,2)
integer :: idx(2),i,j,k
idx=(/3, 2/)
k=0
do i=1,3 ; do j=1,3
k=k+1
aa(i,j) = aa(i,j)+1.d0*k
enddo; enddo
write(*,*),shape(aa)
write(*,'(3G24.6,2X)') aa
bb=aa(idx,idx)
print*,shape(bb)
write(*,'(2G24.6,2X)'),bb
end

输出:

       3           3
1.00000 4.00000 7.00000
2.00000 5.00000 8.00000
3.00000 6.00000 9.00000
2 2
9.00000 6.00000
8.00000 5.00000

关于fortran - 数组值数组索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4715143/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com