matlab2016b+vs2010+ivf2013+f90

其实默认是f77语法,但通过配置可以改变为自由格式。

默认只能f77代码,怎样修改:

找到:mex_FORTRAN_win64,删掉fixed就可以用f90了。


大体过程:

1.在matlab中配置fortran编译环境: mex -setup FORTRAN
2.写好源代码,自定义子函数仍可以像往常一样调用别的子函数
3.将matlab当前路径调整到当前源代码文档所在路径
4.在matlab命令行输入编译命令:mex csuherror.f90
5.像使用matlab内置函数一样使用此函数,error=csuherror(X),其中X为csuh的9个参数(包括C),输出的为计算误差
6.若需要调试,需要这样编译:mex -g csuherror.f90 ,之后通过vs附加matlab到进程,并打开源代码加断点,在matlab运行时就可以调试了,具体请参考帮助文档。


下面是一个例子:

先写fortran代码:传入一个数组和一个数字,输出一个数组

Add.f90 ,注意此文档名为将来matlab调用的函数名,调用函数名时与其内的子函数名称Add无关。
 #include "fintrf.h" !必须有的头文件,里面有mxGetPr, mxGetM, mxGetN,mxCreateDoubleMatrix等函数的申明 http://yuehongliang2000.lofter.com/post/1d001431_ab72071

       subroutine mexFunction(OutSum,OutVar,InSum,InVar)!函数接口名称必须为mexFunction,

     !OutSum:输出参数个数

     !OutVar:输出参数数组指针

     !InSum:输入参数个数

     !InVar:输入参数数组指针

     !参数顺序不能随意更改
Integer InSum,OutSum mwPointer InVar(*),OutVar(*) !mwPointer专门用于表示指针变量,这个不能随意用Integer代替 mwPointer mxGetPr, mxGetM, mxGetN,mxCreateDoubleMatrix !这个对返回指针函数的再次申明,
integer, parameter :: fp = selected_real_kind(,)
Integer , parameter :: myINT = SELECTED_INT_KIND( ) Real(fp),Allocatable::x(:,:),y(:,:)
real(fp)::z Integer m,n If(InSum/=)Then call mexErrMsgIdAndTxt('MATLAB:InputTooBig','输入参数个数必须为2个') Return EndIf m=mxGetM(InVar())!获取第1个输入参数的行数 n=mxGetN(InVar())!获取第1个输入参数的列数 Allocate(x(m,n),y(m,n)) Call mxCopyPtrToReal8(mxGetPr(InVar()),x,m*n)!将第1个参数数组赋值给x变量 Call mxCopyPtrToReal8(mxGetPr(InVar()),z,)!将第2个整数变量赋值给z Call Add(x,y,z,m,n)!调用内部函数 OutVar()=mxCreateDoubleMatrix(m,n,)!给返回参数分配内存 Call mxCopyReal8ToPtr(y,mxGetPr(OutVar()),m*n)!将返回参数赋值给分配的内存 DeAllocate(x,y)!释放临时分配的内存 Return End SubRoutine ! SubRoutine Add(x,y,z,m,n)
!
! Integer,Intent(In)::m,n
! integer, parameter :: fp = selected_real_kind(,)
!
! Real(fp),Intent(In)::x(m,n),z
!
! Real(fp),Intent(Out)::y(m,n)
!
! Integer i,j
!
! Do i=,m
!
! Do j=,n
!
! y(i,j)=x(i,j)+z
!
! EndDo
!
! EndDo
!
! Return
!
!End SubRoutine SubRoutine Add(x,y,z,m,n) Integer,Intent(In)::m,n
integer, parameter :: fp = selected_real_kind(,) Real(fp),Intent(In)::x(m,n),z Real(fp),Intent(Out)::y(m,n) Integer i,j Do i=,m Do j=,n y(i,j)=x(i,j)+z EndDo EndDo Return End SubRoutine

将matlab当前路径改为Add.f90同目录路径,然后 : mex Add.f90   ,之后会生成Add.mex64

在matlab命令行窗口输入:

x=[1 2 3];

a=2;

y=Add(x,a)

---

我把Add.f90改为multiple.f90的话:

效果一样。

同样的功能的m文档,会优先调用.mexw64,且速度很快。所以可以写一个同名的m文档,只有函数名,之后全是注释文档,用以查阅。

matlab和fortran混合编程的更多相关文章

  1. matlab和c++混合编程---matlab和vs的环境配置问题及方法和步骤(转载)

    matlab和c++混合编程---方法和步骤 matlab和c++混合编程---matlab和vs的环境配置问题 摘要:Matlab具有很强的数值计算和分析等能力,而C/C++是目前最为流行的高级程序 ...

  2. [转载:]C#与Fortran混合编程之本地调用Fortran动态链接库

    前言 C#发展到现在,已是一门相当完善的语言,他基于C语言风格,演化于C++.并依靠强大的.NET底层框架.C#可以用来快速构建桌面及Web应用.然而在我们的实际工作中,尽管C#已经非常完善,但还是不 ...

  3. 【目录】Matlab和C#混合编程文章目录

    本博客所有文章分类的总目录链接:[总目录]本博客博文总目录-实时更新 1.Matlab和C#混合编程文章目录 9.接触Matlab10年后的一个总结,随时使用Matlab要掌握的一些要点 8.国内第一 ...

  4. 算法库:Matlab与C++混合编程

    算法库:Matlab与C++混合编程 最近做光流算法预演过程中,下载的源码中涉及到了Matlab和C++的混合编程.在同事Matlab2014的环境下,程序到是一下就运行通过了.但在我这Matlab2 ...

  5. Matlab与.NET混合编程解决人脸识别问题

    原文:[原创]Matlab与.NET混合编程解决人脸识别问题 如果这些文章对你有用,有帮助,期待更多开源组件介绍,请不要吝啬手中的鼠标. [原创分享]Matlab.NET混编调用Figure窗体 ht ...

  6. Matlab与C++混合编程(依赖OpenCV)

    Matlab与C++混合编程实际上就是通过Matlab的Mex工具将C++的代码编译成Matlab支持调用的可执行文件和函数接口.这样一方面可以在Matlab中利用已经编写好的函数,尽管这个函数是用C ...

  7. matlab与vs混合编程/matlab移植

    前言 项目算法中包含了不同编译工具的代码,分别是matlab和VS,需要将二者结合起来,统一在同一个系统工作,此时就要用到matlab和vs混合编程. 在matlab中将.m文件编译生成库文件等供外部 ...

  8. [转] Matlab与C++混合编程(依赖OpenCV)

    作者 zouxy09@qq.com,原文 Matlab与C++混合编程(依赖OpenCV) 之前在运行别人论文的代码的时候,经常有遇到Matlab与C++混合编程的影子.实际上就是通过Matlab的M ...

  9. [转] Matlab与C++混合编程,添加OpenCV库

    原文地址 峰回璐转 最近在做运动医学软件优化工作,此款软件框架及算法语言全由matlab实现,虽然matlab矩阵运算.数值计算能力强大,但速度让人难以忍 受.软件立刻移植到C++上又不太实际,故采用 ...

随机推荐

  1. Docker 问题[Warning] IPv4 forwarding is disabled. Networking will not work.

    Docker 问题[Warning] IPv4 forwarding is disabled. Networking will not work. 在使用Dockerfile创建Docker镜像的时候 ...

  2. windows索引服务

        windows索引服务是windows操作系统提供的桌面搜索引擎,通过预先创建索引来提高对硬盘上文件内容的搜索速度.以windows服务程序的方式运行. 一.工作方式 1.对指定路径下的文件创 ...

  3. 常用的UI控件

    关于本文:作为一名iOS软件工程师,熟练规范的使用常用的UI控件是必备的基础技能. 指示器(UIActivityIndicatorView)----转动的等待小菊花 提醒对话框(UIAlertView ...

  4. Python之第一次自夸

    有一个好玩的代码 import win32com.client g = win32com.client.Dispatch("SAPI.SPVOICE") g.Speak(" ...

  5. KMP(模板)

    kmp算法是解决单模匹配问题的算法,难点在于求next[]数组 求next[]数组:对于模板串的所有前缀子串的最长公共前后缀的长度,就是next[]数组的值 eg:主串为cbbbaababac  子串 ...

  6. JS之如何将Promise.then的值直接return出来

    不可能直接将Promise.then的值直接return出来,只能return出Promise对象,然后继续.then去操作异步请求得到的值.

  7. 为何以及如何学Linux系统?

    在当今的社会中,linux用处实在是太过广泛了.现在用在服务器和嵌入式上的Linux发行版本数不胜数,桌面上linux只占1%的比例,但这不代表linux比windows和mac 做得差,实际上桌面系 ...

  8. MongoDB in 数量限制

    1.查询语句本身其实是一个document, 最大为16MB(3.4,4.0 的限制,官方文档)2.查询语句本身,也就是{ '' : { '$in' : [] }}, 大小为 22字节3.每增加一个字 ...

  9. zookeeper logs is missing zookeeper 日志丢失

    ERROR [main:QuorumPeerMain@85] - Invalid config, exiting abnormally Invalid config, exiting abnormal ...

  10. Day3-J-4 Values whose Sum is 0 POJ2785

    The SUM problem can be formulated as follows: given four lists A, B, C, D of integer values, compute ...