You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Fortran中是否存在标准合规的转置数组指针获取方式?

更新:可查看我补充的回答,获取一个“尚可接受”的解决方案

Fortran转置数组指针的标准实现探讨

对于二维数组,transpose(x)表达式无法用于“变量上下文”,因此无法将其传入子程序以修改数组。若想避免将转置结果复制到临时数组(后续还要复制回去)的开销,仅转置数组描述符(即交换步长和边界)的指针显然十分有用。但遗憾的是,目前没有直接的语法可用于交换索引的指针关联语句……

非标准的临时解决方案

有趣的是,测试环境为gfortran 13.3.0的编译器接受一种通过函数调用实现该功能的写法:

module p_hack
  implicit none
contains
  function passoc(a)   ! 指针函数,返回值可用于变量上下文
    integer, target   :: a(:,:)
    integer, pointer  :: passoc(:,:)
    passoc => a        ! 仅建立指针关联,未执行转置操作
  end function
end

program test
  use p_hack
  integer          :: A(2,2)     ! 注意:原数组未设置target属性!
  integer, pointer :: pA(:,:)

  pA => passoc( transpose(a) )     !!! 实现转置指针关联 !!!

  pA(1,:) = [10, 20]
  pA(2,:) = [30, 40]

  print *, A(1,:)     ! 输出结果为上述赋值的转置
  print *, A(2,:)
end

程序运行后输出:

10          30
        20          40

可见指针数组描述符是以转置顺序访问原数组的,且编译器未创建临时数组。但这种写法的跨编译器兼容性无法保证,或许为原数组添加target属性能提升可靠性,但本质上仍不符合Fortran标准规范。

核心问题

是否存在符合Fortran标准规范的方式实现类似的转置指针功能?

相关标准扩展可能性

目前Fortran标准允许类似的偏移索引指针操作:

pA(1:2, 4:5) => A    ! 符合标准(需A具备target属性)
pA(3:4, 2:3) => A    ! 编译器可正常处理

注:针对“反向索引指针”的场景,标准已提供直接实现方式:

pA(1:2, 2:1:-1) => A          ! 编译错误:"Stride must not be present"
pA => passoc( A(:,2:1:-1) )   !!! 此写法可行,但无需使用
pA => A(:,2:1:-1)             ! ... 标准已允许直接关联反向索引数组

但对于转置操作,目前尚无简便的标准解决方案。


内容的提问来源于stack exchange,提问作者Jos Bergervoet

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.02 04:57:26