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
相关产品推荐
相关产品推荐

