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. js读取本地json/txt/xml存在跨越问题,可以用jsonp 读取本地json文件

    想自己用 js写一个原生的ajax请求,访问本地文件,json/txt.但是demo,写了一个后,发现 原来是跨域了. js 写的原生ajax 请求代码如下 html代码 <div id=&qu ...

  2. JSON传输图片帮助类

    JSON传输图片帮助类 2014-05-27 16:11:22|  分类: Java |  标签:解决方案  java  json  |举报|字号 订阅     原理:将图片转换为字节流,再将字节流用 ...

  3. HBase基准测试

    执行命令: hbase org.apache.hadoop.hbase.PerformanceEvaluation 返回信息: [root@node1 /]# hbase org.apache.had ...

  4. 如何给Sqlite添加复合主键

    如果是想两个字段组成一个复合主键的话可以如下.SQL code sqlite> create table t2 ( ...> id1 int , ...> id2 int, ...& ...

  5. eclipse js文件无法保存错误

    错误信息如下 Save Failedjdk.nashorn.internal.runtime.ECMAException.getEcmaError()Ljava/lang/Object; 网上多番查找 ...

  6. ng-校验重复并提示具体重复内容

    //校验其他等级模块是否存在"职业类别"完全一致的等级模块 var moreFlag=false; for(var i=0;i<$scope.djArr.length;i++ ...

  7. SpringBoot 入门demo

    创建SpringBoot项目方式一 (1)新建maven项目,不使用骨架. 使用maven管理依赖就行了,不必使用骨架(模板). (2)在pom.xml中添加 <!--springboot核心. ...

  8. jquery获取select选中的文本值

    误区: 一直以为jquery获取select中option被选中的文本值,是这样写的:   $("#id").text();  //获取所有option的文本值 实际上应该这样: ...

  9. 1-7SpringBoot之表单验证@Valid

    SpringBoot提供了强大的表单验证功能实现,给我们省去了写验证的麻烦: 这里我们给下实例,提交一个有姓名和年龄的表单添加功能, 要求姓名不能为空,年龄必须是不小于18 : 我们先新建一个Stud ...

  10. redis提供的持久化机制(rdb,aof)

    Redis提供的持久化机制 Redis是一种面向“key-value”类型数据的分布式NoSQL数据库系统,具有高性能.持久存储.适应高并发应用场景等优势.它虽然起步较晚,但发展却十分迅速. 近日,R ...