Matlab与C混编的介绍

原本写给一个朋友的,帮助她入门matlab与C混编的

>#####环境:
* Matlab:MATLAB R2013a
* C编译器VC++2012

===
#####配置环境:
 在**Matlab**命令行下输入:

**step.1**

 ```
mex -setup

 ```

---
 **step.2**

你也可以使用:

 ```
 help mex

 ```
查看更多信息 

---

**step.3**

按提示安装C编译器

---
**step.4**

编写**c-mex**文件
可使用

```
edit

```
命令在matlab中打开编辑器

===

#####**C-MEX**文件的结构:
 * 引入头文件:

```
#include "mex.h" 

```
* 定义计算子函数

```
double add(double x, double y)
{
    return x + y;
}

```
*引入接口函数

```

void mexFunction(
int nlhs,
mxArray *plhs[],
int nrhs,
const mxArray *prhs[])
{
/*your code*/
}

```
====
####说明:

> 核心是计算子函数,在C语言中函数要先声明才能使用,所以计算子函数的函数声明放在前面。

> 接口函数是C语言和matlab的接口,或者理解成协议,桥梁也可以,它接受4个参数:nlhs是左手参数个数,plhs是左手参数数组其内容为指针,该指针指向数据类型为mxArray的变量。相对应的nrhs和prhs。

> 编写的**C-Mex**文件应该保存为.c文件,文件类型是**all file**,尤其要强调的一点是,该文件的文件名要和函数的函数名一致,不然使用的时候会报**undefined function**的错误

>当启用mex之后,你可以使用这段程序来检查环境是否正确:

```
[print.c]
# include "mex.h"

void mexFunction(int nlhs,double *plhs[],int nrhs,double *prhs[]){

    mexPrintf("hello");

}

```
保存为print.c之后命令行运行

```
>>mex print.c
>>print

```
如果编译没问题,打印出hello>>这种形式,那么说明环境ok

> 下面是一个完整的例子及其过程 :

```

[add.c]

#include "mex.h"  

double add(double x, double y)
{
    return x + y;
}

void mexFunction(int nlhs,mxArray *plhs[], int nrhs,const mxArray *prhs[])
{
    double *a;
    double b, c;
    plhs[0] = mxCreateDoubleMatrix(1, 1, mxREAL);
    a = mxGetPr(plhs[0]);
    b = *(mxGetPr(prhs[0]));
    c = *(mxGetPr(prhs[1]));
    *a = add(b, c);
}

```

在命令行中执行

```
mex add.c

```

来编译它

若无报错,再执行

```
c=add(1.1,2.2)

```
则c的值即是3.3

关于此段程序,可参考 [这篇文章](http://blog.sina.com.cn/s/blog_468651400100coas.html)

  

时间: 2024-10-13 20:53:14

Matlab与C混编的介绍的相关文章

Matlab + VS | Matlab2014a + VS2010 Win7 混编调试

Matlab在处理矩阵运算等数学类操作时很方便,但是在循环处理上效率相较VS低了很多,所以经常会用到mex对Matlab的.m混编C文件,调用C函数,提高代码运行效率.以上是我的一点粗浅的理解,欢迎大家补充. 要进行Matlab和C混编,首先需要安装Matlab和VS或VC(Windows系统).我软件的版本是Matlab2014a和VS2010,只要可以互相兼容调用,编译器的版本倒不是区别很大. 下面介绍一个Matlab通过Mex混编C的简单例子.代码主要功能是输入数组b和整数a,输出数组c的

Linux 下C与matlab 混编

1 概述 1.1 Matlab简介 MATLAB是美国MathWorks公司出品的商业数学软件,用于算法开发.数据可视化.数据分析以及数值计算的高级技术计算语言和交互式环境,主要包括MATLAB和Simulink两大部分.MATLAB应用非常之广泛! MATLAB 亦可以与其他高级语言C/ C++/ C#/Java/Fortran等进行混合编程. 1.2 什么是Matlab引擎 所谓Matlab引擎(engine),是指一组Matlab提供的接口函数,支持C/C++.Fortran等语言,通过这

Fortran与C的混编

\(Fortran\) 作为用于科学计算的一种编译型语言积累了大量数值计算的库,但对于现代编程来说, \(Fortran\) 无 \(GUI\)库 是其一大短板.本文就\(Fortran\) 与 \(C\)混合编程进行简单介绍. \(Fortran和C\) 混编共有3种方式: 基于源代码的混编 基于动态连接库DLL的混编 基于可执行文件的混编 \(Fortran\) 和 \(C\) 语言同属于编译型语言,因此可以使用任意一种语言来编写主程序或调用程序,对另一种语言编写的例程进行调用. 例程的作用

OC跟Swift混编

OC项目中使用Swift 本文版权归作者所有,如需转载请联系孟祥月 CSDN博客:http://blog.csdn.net/mengxiangyue  独立博客:http://mengxiangyue.com 最近公司的项目开始计划使用Swift,由于原先的工程都是使用OC编写的,不可能一下全部转换成Swift,所以采用OC与Swift混编的方式是最好的选择.这篇文章只是一个简单的介绍,并没有太高深的知识. 我新建了一个演示的OC工程,当然你可以使用你已经存在的OC的工程.如果我们想要在OC工程

第30章 混编模式(3)

30.3 事件触发器的开发(观察者模式+中介者模式) 30.3.1 场景介绍 (1)有一产品它有多个触发事件(如创建事件.修改.删除),如创建文本框时触发OnCreate事件,修改时触发onChange事件,双击时触发onDblClick事件. (2)当产品触发事件时,会创建相应的产品事件对象(ProductEvent),并将这个事件对象传递给观察者,以便通知观察者该事件的发生. (3)观察者实现上是一个事件的分发者,相当于中介模式中的中介对象,会把这个事件分发者相应的事件处理对象. 30.3.

iOS开发——技术精华Swift篇&Swift 2.0和Objective-C2.0混编之第三方框架的使用

Swift 2.0和Objective-C2.0混编之第三方框架的使用 swift 语言是苹果公司在2014年的WWDC大会上发布的全新的编程语言.Swift语言继承了C语言以及Objective-C的特性,且克服了C语言的兼容性问题.Swift语言采用安全编程模式,且引入了多种新功能,使得编程工作更加简便,灵活! 2015年6月9日苹果又一次给所有开发之者带来了一个惊喜,那就是今年年底swift讲开源,者队iOS开发着来说无疑是一个值得兴奋的消息,可是就在这短短的几个月里面swift吸引了越来

Objective-C 与 Swift 混编之路

本文摘自: http://blog.csdn.net/mmoaay/article/details/48422309 本文内容基于 Xcode 6.4 和 Swift 1.2 重要资料 Using Swift with Cocoa and Objective-C 官方文档 为什么要混编? 语言发展趋势(TIOBE),Swift 排行持续上升, OC 排行呈重力下降 项目正常迭代需要  很多第三方库仍然使用 OC 实现 项目中原来已经用 OC 实现的模块如果使用 Swift 重写,代价稍大 我们需

详解swift和OC以及C语言的混编(不看后悔!)

前言: Swift 语言出来后,可能新的项目直接使用swift来开发,但可能在过程中会遇到一些情况,某些已用OC写好的类或封装好的模块,不想再在swift 中再写一次,或者有一些第三方使用OC写的,没有swift版本,怎么办?那就使用混编.这个在IOS8后是允许的. 先简单的入手,先研究在同一个工程目录下混合使用的情况.这里主要介绍swift类中调用OC方法和swift类中调用C函数以及OC类中调用swift的函数这三种类型的混编.另外,小编也是边研究边尝试才做出结果的,因此命名并非规范命名,大

OC与JS的交互(iOS与H5混编)

在开发过程中,经常会出现需要iOS移动端与H5混编的使用场景. iOS中加载html网页, 可以使用UIWebView或WKWebView. 本篇博客将介绍两种控件使用过程中如何实现OC与JS的交互. UIWebView delegate 协议方法 //网页即将开始加载 - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewN