Fortran Coder

标题: 请问fortran有办法实现数组维数是个变量吗? [打印本页]

作者: statdog    时间: 2020-5-24 02:30
标题: 请问fortran有办法实现数组维数是个变量吗?
目前在做一个tensor data的项目,要写一个R package, 导师建议我用fortran写核心运算部分。目前在造轮子,运算需要处理不同维数的数组,所以我希望一个子程序可以同时处理3,4,5维数组。但是我查的资料都说,在声明数组的时候必须指定数组维数。想求助一下各位大大,在fortran中有没有方法可以让子程序的数组参数的维数不是一个constant?十分感谢!

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

感谢。我暂时用了select case对3到5每个case写了一遍函数。
作者: statdog    时间: 2020-5-24 14:20
vvt 发表于 2020-5-24 12:51
1. 如果你的多维数组不同元素直接是独立的,毫不相干。那么可以尝试用“逐元函数”,比如语法内的 sin 函数 ...

目前还遇到一个问题,就是我想对子程序的几个argument写一个循环。
比如subroutine(x,y, arg1,arg2,arg3,arg4,arg5),我想有一个循环从i=1到5每次对argi做相同的处理。请问大大这样应该怎么实现呢?感谢!
作者: li913    时间: 2020-5-24 15:05
statdog 发表于 2020-5-24 14:20
目前还遇到一个问题,就是我想对子程序的几个argument写一个循环。
比如subroutine(x,y, arg1,arg2,arg3, ...

如果参数类型一致,用数组;否则,手动处理。
作者: vvt    时间: 2020-5-24 16:42
statdog 发表于 2020-5-24 14:15
感谢。我暂时用了select case对3到5每个case写了一遍函数。

那你岂不是得写3个参数??
作者: statdog    时间: 2020-5-24 21:17
li913 发表于 2020-5-24 15:05
如果参数类型一致,用数组;否则,手动处理。

这些参数是不同维数的矩阵,用数组的话,把它们拉直放在一个数组里变成一个参数确实可以处理。我试一下。感谢!
作者: statdog    时间: 2020-5-24 21:21
vvt 发表于 2020-5-24 16:42
那你岂不是得写3个参数??

我把输入的tensor拉直了,在不同的case里分别reshape回去再拉直,这样似乎没有问题。




欢迎光临 Fortran Coder (http://bbs.fcode.cn/) Powered by Discuz! X3.2