TypechoJoeTheme

MetMan's Blog

网站页面

Fortran Ar_

MetMan博 主神仙
2024-11-19
/
0 评论
/
100 阅读
/
471 个字
/
百度已收录
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参数相同形状,其元素必须是1,2,..,n1,2,..,n的排列,n是shape参数数组的元素个数。order指定source数组元素放置的维顺序。如果order忽略,假定其为1,2,...,n1,2,...,n,即按照正常数组顺序。

示例:

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

参考资料

https://www.intel.com/content/www/us/en/docs/fortran-compiler/developer-guide-reference/2023-0/array-constructors.html

https://www.intel.com/content/www/us/en/docs/fortran-compiler/developer-guide-reference/2023-0/reshape.html#GUID-7C019494-05A4-4F18-8675-62C9533ACB80

朗读
赞(0)
赞赏
感谢您的支持,我会继续努力哒!
版权属于:

MetMan's Blog

本文链接:

https://blog.metman.top/index.php/archives/147/(转载时请注明本文出处及文章链接)

评论 00
  • OωO
  • |´・ω・)ノ
  • ヾ(≧∇≦*)ゝ
  • (☆ω☆)
  • (╯‵□′)╯︵┴─┴
  •  ̄﹃ ̄
  • (/ω\)
  • ∠( ᐛ 」∠)_
  • (๑•̀ㅁ•́ฅ)
  • →_→
  • ୧(๑•̀⌄•́๑)૭
  • ٩(ˊᗜˋ*)و
  • (ノ°ο°)ノ
  • (´இ皿இ`)
  • ⌇●﹏●⌇
  • (ฅ´ω`ฅ)
  • (╯°A°)╯︵○○○
  • φ( ̄∇ ̄o)
  • ヾ(´・ ・`。)ノ"
  • ( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
  • (ó﹏ò。)
  • Σ(っ °Д °;)っ
  • ( ,,´・ω・)ノ"(´っω・`。)
  • ╮(╯▽╰)╭
  • o(*////▽////*)q
  • >﹏<
  • ( ๑´•ω•) "(ㆆᴗㆆ)
  • (。•ˇ‸ˇ•。)
  • 泡泡
  • 阿鲁
  • B站
  • 颜文字
登录
X
用户名
密码