用R语言调用Fortran子程序

2024-04-22 10:38

本文主要是介绍用R语言调用Fortran子程序,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

首先写这篇博客的原因是因为关于R调用Fortran之前摸索了两天,然后没弄通就放弃了,后来因为课题需求不得不用R调用大牛写的Fortran程序(毕竟自己写不出来),所以只能硬着头皮去调通程序,然后各种搜索资料,苦苦琢磨了两三天,最后终于在用is.loaded看是否导入成功的时候,看到了我期待已久的TRUE了,此时我的心率可以说比我跑完5公里之后的心率还要快,激动的我晚上直接奖励了自己一个大鸡腿,简直是高兴得不得了(恕我要求低,碰到这么点成就就差点喜极而泣)。

回到正题,首先需要说明,你必须跟着我做好每一步,一步都不能漏,等自己搞通了之后再考虑通过其路径,我给的方法是最直接最笨的方法(很适合没有一点计算机基础的同学,特别是看到dos窗口都觉得很神奇的同学)

1.首先毋庸置疑的是你需要安装R(当然加装Rstudio肯定更好用)和Fortran(我是在六维空间下载的,装的是Fortran6.5简版)

2.然后不要问我为什么,直接去官网下载Rtools(你可以不下,很抱歉,我只会这个方法,前提是你不用我写的方法),网址是https://cran.r-project.org/bin/windows/Rtools/,然后选择一个版本下载(我下载的版本是Rtools33.exe)。安装的时候尽量安装在C盘吧,当然我装的是D盘。重要的事情来了,你装的时候会有提示要不要修改环境变量path,这个请一定要勾选,然后就会自动把Rtools路径添加到path变量了。不过忘记勾选的朋友也不要惊慌,跟着我来修改一遍:找到计算机,然后右键进入属性,然后高级系统设置,单击高级里面的环境变量,点开之后下面的系统变量中找到path变量,单击编辑选项,在后面加上 ;C:\Rtools\bin;C:\Rtools\gcc-4.6.3\bin;  注意:我帮你把分号都写好了,你如果装在D盘就把C换成D就行了。

3.前面两步一定要全部做好了,才能进行接下来我要介绍的步骤,否则会出现命令无效或者命令不存在等等让你焦虑的错误,不要问我怎么改或者怎么办,返回去按照我说的再做一遍吧,再次声明:我只会这样做(怪我太笨)。接下来这个步骤是给那些可能都不知道Fortran怎么用的同学。先打开Fortran,点击file按钮然后new,然后选择Fortran Dynamic Link Library,给个项目名称multiply(这里采用的例子是来自网址https://en.wikiversity.org/wiki/R_(programming_language)/Tutorials/Connecting_Fortran_and_R),然后点击ok键,会弹出一个窗口,选项有两个(第一个说是创建空白库,第二个是会自动写入空函数,具体英文我就不写了,直接选择第二个就行了),我们选择第二个(免得又要自己去创建函数,省去这个步骤),然后finish就行了。创建完之后呢我们可以在multiply files中的source files下看到multiply.f90这个函数,双击进入函数,将给你的网址例子中的代码复制进去并编译执行(这个按钮就不用我教了吧,用过C的人都知道在哪里),执行完之后一定确保不报错才行哈。

4.前面三步很关键,没完成或者报错的同学就不要继续了,返回去好好改改,看看哪步忘记了。完成第三步之后我们就找到multiply这个文件夹(在你安装的Fortran6.5文件夹下),然后复制其中的文件multiply.f90,把它放在C:\Rtools\gcc-4.6.3\bin目录下。好了,到这里,你该做的准备工作就结束了,这是非常重要的,不要漏掉每个细节,不然没法继续下一步了。

5.此时就可以利用Rtools的gfortran工具了,具体操作是这样的,先打开DOS窗口(方法是:运行(快捷键是Windows键+R)->cmd),这个应该不用我教的,相信大家都会。然后在DOS里面执行下列代码:
c:  #设置路径到c盘下,如果装在D盘上就写d:
cd Rtools\gcc-4.6.3\bin  #相当于将目录更改到C:\Rtools\gcc-4.6.3\bin中
gfortran -shared -o multiply.dll multiply.f90  #执行完之后呢不能报错,否则就不会在bin目录下生成multiply.dll文件

6.完成第五步之后几乎该做的工作都做完了,剩下的就是R的事情了,R中的代码如下:
dyn.load("C:/Rtools/gcc-4.6.3/bin/multiply.dll") #加载动态库
is.loaded("multiply") #看是否导进来了,得到TRUE才说明加载成功
a=5
b=2
.Fortran("multiply",as.integer(a),as.integer(b),c=integer(1)) #调用mutiply函数

到这里你就漂亮的完成一次R调用Fortran了,我用了最简单最笨的的办法来进行的,应该都能看得懂。你应该庆祝下自己完成了如此漂亮的突破,但是这貌似只是刚起步,因为还有一件很棘手的事情需要你处理,那就是修改Fortran代码,改成R能调用的形式(给的这个例子未免过于简单了,因为就做了一个乘法),这就需要你稍微了解Fortran的语法和数据结构了。首先声明一下,R只能调用Fortran中的子程序(即subroutine,相当于R中的function),也不要问我为什么,别人是这么设计的我也无法回答(毕竟不是我写的,否则我就不会这么费事了)。这里我觉得我不用说太多,因为不会Fortran的我说了也是白说,会Fortran的看了我接下来的提醒就会知道怎么去修改程序了。

首先对于那些函数互相调用,出现一堆common的程序我相信很多人头都大了,这个你不用想太多,只要保证你想调用的主程序里面必须也有同样common,而且common中的变量确实存在(不存在的话就需要通过参数输入了)。然后呢就是变量的维数要做到R和Fortran中的保持一致,毕竟Fortran所有变量都需要指定类型(向量就要设置维数),所以你要把R中输入到Fortran中的参数事先维数统一。其他的就没啥问题了,前提是你的Fortran程序是正确的。

最后呢在这里要感谢在网上分享心得的热心网友,虽然我都不知道自己在哪看到的具体方法,但是希望看到我写的这篇博客的朋友在学习中有什么好的收获麻烦花点时间分享出来,互相学习才能更快的进步。



这篇关于用R语言调用Fortran子程序的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/925562

相关文章

Go语言中nil判断的注意事项(最新推荐)

《Go语言中nil判断的注意事项(最新推荐)》本文给大家介绍Go语言中nil判断的注意事项,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1.接口变量的特殊行为2.nil的合法类型3.nil值的实用行为4.自定义类型与nil5.反射判断nil6.函数返回的

Java中调用数据库存储过程的示例代码

《Java中调用数据库存储过程的示例代码》本文介绍Java通过JDBC调用数据库存储过程的方法,涵盖参数类型、执行步骤及数据库差异,需注意异常处理与资源管理,以优化性能并实现复杂业务逻辑,感兴趣的朋友... 目录一、存储过程概述二、Java调用存储过程的基本javascript步骤三、Java调用存储过程示

Go语言数据库编程GORM 的基本使用详解

《Go语言数据库编程GORM的基本使用详解》GORM是Go语言流行的ORM框架,封装database/sql,支持自动迁移、关联、事务等,提供CRUD、条件查询、钩子函数、日志等功能,简化数据库操作... 目录一、安装与初始化1. 安装 GORM 及数据库驱动2. 建立数据库连接二、定义模型结构体三、自动迁

Python中Tensorflow无法调用GPU问题的解决方法

《Python中Tensorflow无法调用GPU问题的解决方法》文章详解如何解决TensorFlow在Windows无法识别GPU的问题,需降级至2.10版本,安装匹配CUDA11.2和cuDNN... 当用以下代码查看GPU数量时,gpuspython返回的是一个空列表,说明tensorflow没有找到

Go语言代码格式化的技巧分享

《Go语言代码格式化的技巧分享》在Go语言的开发过程中,代码格式化是一个看似细微却至关重要的环节,良好的代码格式化不仅能提升代码的可读性,还能促进团队协作,减少因代码风格差异引发的问题,Go在代码格式... 目录一、Go 语言代码格式化的重要性二、Go 语言代码格式化工具:gofmt 与 go fmt(一)

python如何调用java的jar包

《python如何调用java的jar包》这篇文章主要为大家详细介绍了python如何调用java的jar包,文中的示例代码简洁易懂,具有一定的借鉴价值,有需要的小伙伴可以参考一下... 目录一、安装包二、使用步骤三、代码演示四、自己写一个jar包五、打包步骤六、方法补充一、安装包pip3 install

Go语言中泄漏缓冲区的问题解决

《Go语言中泄漏缓冲区的问题解决》缓冲区是一种常见的数据结构,常被用于在不同的并发单元之间传递数据,然而,若缓冲区使用不当,就可能引发泄漏缓冲区问题,本文就来介绍一下问题的解决,感兴趣的可以了解一下... 目录引言泄漏缓冲区的基本概念代码示例:泄漏缓冲区的产生项目场景:Web 服务器中的请求缓冲场景描述代码

Go语言如何判断两张图片的相似度

《Go语言如何判断两张图片的相似度》这篇文章主要为大家详细介绍了Go语言如何中实现判断两张图片的相似度的两种方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 在介绍技术细节前,我们先来看看图片对比在哪些场景下可以用得到:图片去重:自动删除重复图片,为存储空间"瘦身"。想象你是一个

Go语言中Recover机制的使用

《Go语言中Recover机制的使用》Go语言的recover机制通过defer函数捕获panic,实现异常恢复与程序稳定性,具有一定的参考价值,感兴趣的可以了解一下... 目录引言Recover 的基本概念基本代码示例简单的 Recover 示例嵌套函数中的 Recover项目场景中的应用Web 服务器中

Java调用C#动态库的三种方法详解

《Java调用C#动态库的三种方法详解》在这个多语言编程的时代,Java和C#就像两位才华横溢的舞者,各自在不同的舞台上展现着独特的魅力,然而,当它们携手合作时,又会碰撞出怎样绚丽的火花呢?今天,我们... 目录方法1:C++/CLI搭建桥梁——Java ↔ C# 的“翻译官”步骤1:创建C#类库(.NET