Fortran Ar_
11/19
本文最后更新于
2024年11月19日,已超过
140天没有更新。如果文章内容或图片资源失效,请留言反馈,我会及时处理,谢谢!
Fortran数组构造器(array constructor)语法可以用来创建和赋值一维(rank-one)数组和数组常量。
使用(/ /)
或者[ ]
包括数组构造表达式。两种用法是等价的,但[ ]
方式有点像Python列表语法(我更喜欢后者用法)。
数组构建器语法形式包括以下四种:
- (/标量表达式/)
标量表达式值对应新数组每个元素。
1 2 | integer :: a1(5) a1 = (/1,2,3,4,5/) |
- (/数组表达式/)
数组表达式每个元素值对应新数组的元素。
1 2 | integer :: a2(5) a2 = (/a1(1:5)-10/) |
- (/隐式DO循环/)
类似DO循环结构,生成数组元素列表。(联想Python的列表推导式 list comprehension)
1 2 | integer :: a3(5) a3 = (/(j, integer :: j=6, 10)/) ! 迭代变量j可以局地声明 |
注意gfortran 13.2测试还未支持该语法。
- 混合形式
以上三种形式可以组合使用。
1 2 | integer :: a4(15) a4 = [-1,-2,a1,(i+7,i=1,5),0,1,2] |
下面看一个不断“增长”大小的可分配动态数组示例。
1 2 3 4 5 6 7 8 9 10 11 | integer,allocatable :: a5(:) allocate(a5(0)) ! 0个元素的数组 print*,"allocated(a5)=",allocated(a5) ! 已分配状态 a5 = [ integer :: ] ! 这也是合法语法 print*,'T1:size(a5) = ',size(a5) ! size为0 a5 = [a1] ! 赋值维数不一致会使a5重新分配,shape与a1相同,a1数组元素赋值给a5 print*,'T2:size(a5) = ',size(a5) print*,'a5 =',a5 a5 = [a1,a5] print*,'a5 =',a5 |
多维数组创建
但数组构造器只能创建一维数组,如果需要创建多维数组,可以使用内置函数reshape
实现。
语法:
1 | result = RESHAPE (source,shape[,pad] [,order]) |
其中参数含义:
- source: 输入数组,提供新构造数组的元素
- shape: 一维整数数组,定义新构造数组的形状
- pad:可选参数,如果新构造数组比source大,用于填充额外的值。要求其是与source相同type/kind的数组。
- order:可选参数,整数数组,必须与shape参数相同形状,其元素必须是的排列,n是shape参数数组的元素个数。order指定source数组元素放置的维顺序。如果order忽略,假定其为,即按照正常数组顺序。
示例:
1 2 3 | integer,dimension(3,5) :: a6 a6 = reshape(a4,shape=shape(a6)) !一维数组转变成二维数组 |
利用可选参数order
可以将Fortran数组顺序变为C存储顺序,然后传递给C程序。
1 2 3 4 5 | integer,dimension(5,3) :: a7 a7 = reshape(a6,shape=shape(a7),order=(/2,1/)) !order指定第2维在前 print*,'C order a7= ',a7 |
参考资料


版权属于:
MetMan's Blog
本文链接:
https://blog.metman.top/index.php/archives/147/(转载时请注明本文出处及文章链接)
作品采用:
《署名-非商业性使用-相同方式共享 4.0 国际 》许可协议授权