Fortran Coder

查看: 14064|回复: 7
打印 上一主题 下一主题

[子程序] 请问fortran有办法实现数组维数是个变量吗?

[复制链接]

7

帖子

2

主题

0

精华

入门

F 币
36 元
贡献
20 点
跳转到指定楼层
楼主
发表于 2020-5-24 02:30:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
目前在做一个tensor data的项目,要写一个R package, 导师建议我用fortran写核心运算部分。目前在造轮子,运算需要处理不同维数的数组,所以我希望一个子程序可以同时处理3,4,5维数组。但是我查的资料都说,在声明数组的时候必须指定数组维数。想求助一下各位大大,在fortran中有没有方法可以让子程序的数组参数的维数不是一个constant?十分感谢!
分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩

954

帖子

0

主题

0

精华

大师

F 币
184 元
贡献
75 点

规矩勋章元老勋章新人勋章水王勋章热心勋章

QQ
沙发
发表于 2020-5-24 12:51:30 | 只看该作者
1. 如果你的多维数组不同元素直接是独立的,毫不相干。那么可以尝试用“逐元函数”,比如语法内的 sin 函数,就是一个逐元函数。你可以直接用它处理一个多维数组,计算每一个元素的正弦值。
2. 如果你的多维数组之间不是独立的,相互联系。你只能写多份函数,通过generic name让他们重载成一个通用名的函数名。比如语法内的 sin 函数,它同时也是重载的。
你可以用它处理单精度数据,也可以用它处理双精度数据。其实编译器的运行时库就是写了2份代码(sin和dsin)。

7

帖子

2

主题

0

精华

入门

F 币
36 元
贡献
20 点
板凳
 楼主| 发表于 2020-5-24 14:15:42 | 只看该作者
vvt 发表于 2020-5-24 12:51
1. 如果你的多维数组不同元素直接是独立的,毫不相干。那么可以尝试用“逐元函数”,比如语法内的 sin 函数 ...

感谢。我暂时用了select case对3到5每个case写了一遍函数。

7

帖子

2

主题

0

精华

入门

F 币
36 元
贡献
20 点
地板
 楼主| 发表于 2020-5-24 14:20:54 | 只看该作者
vvt 发表于 2020-5-24 12:51
1. 如果你的多维数组不同元素直接是独立的,毫不相干。那么可以尝试用“逐元函数”,比如语法内的 sin 函数 ...

目前还遇到一个问题,就是我想对子程序的几个argument写一个循环。
比如subroutine(x,y, arg1,arg2,arg3,arg4,arg5),我想有一个循环从i=1到5每次对argi做相同的处理。请问大大这样应该怎么实现呢?感谢!

835

帖子

2

主题

0

精华

大宗师

F 币
3926 元
贡献
2334 点
5#
发表于 2020-5-24 15:05:35 | 只看该作者
statdog 发表于 2020-5-24 14:20
目前还遇到一个问题,就是我想对子程序的几个argument写一个循环。
比如subroutine(x,y, arg1,arg2,arg3, ...

如果参数类型一致,用数组;否则,手动处理。

954

帖子

0

主题

0

精华

大师

F 币
184 元
贡献
75 点

规矩勋章元老勋章新人勋章水王勋章热心勋章

QQ
6#
发表于 2020-5-24 16:42:28 | 只看该作者
statdog 发表于 2020-5-24 14:15
感谢。我暂时用了select case对3到5每个case写了一遍函数。

那你岂不是得写3个参数??

7

帖子

2

主题

0

精华

入门

F 币
36 元
贡献
20 点
7#
 楼主| 发表于 2020-5-24 21:17:35 | 只看该作者
li913 发表于 2020-5-24 15:05
如果参数类型一致,用数组;否则,手动处理。

这些参数是不同维数的矩阵,用数组的话,把它们拉直放在一个数组里变成一个参数确实可以处理。我试一下。感谢!

7

帖子

2

主题

0

精华

入门

F 币
36 元
贡献
20 点
8#
 楼主| 发表于 2020-5-24 21:21:54 | 只看该作者
vvt 发表于 2020-5-24 16:42
那你岂不是得写3个参数??

我把输入的tensor拉直了,在不同的case里分别reshape回去再拉直,这样似乎没有问题。
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2024-12-23 12:01

Powered by Tencent X3.4

© 2013-2024 Tencent

快速回复 返回顶部 返回列表