3.3000

要得出以上的结果,那应该怎样做呢?

解决方法之一是要通过使用MEX文件,MEX文件使得调用C函数和调用Matlab的内置函数一样方便。MEX文件是由原C代码加上MEX文件专用的接口函数后编译而成的。

可以这样理解,MEX文件实现了一种接口,它把在Matlab中调用函数时输入的自变量通过特定的接口调入了C函数,得出的结果再通过该接口调回Matlab。该特定接口的操作,包含在mexFunction这个函数中,由使用者具体设定。

所以现在我们要写一个包含add和mexFunction的C文件,Matlab调用函数,把函数中的自变量(如上例中的1.1和2.2)传给mexFunction的一个参数,mexFunction把该值传给add,把得出的结果传回给mexFunction的另一个参数,Matlab通过该参数来给出在Matlab语句中调用函数时的输出值(如上例中的a)。

比如该C文件已写好,名为add.c。那么在Matlab中,输入:

>> mex add.c

就能把add.c编译为MEX文件(编译器的设置使用指令mex

-setup),在Windows中,MEX文件类型为mexw32,即现在我们得出add.mexw32文件。现在,我们就可以像调用M函数那样调用MEX文件,如上面说到的例子。所以,通过MEX文件,使用C函数就和使用M函数是一样的了。

我们现在来说mexFunction怎样写。

mexFunction的定义为:

void mexFunction(

int nlhs,

mxArray *plhs[],

int nrhs,

const mxArray *prhs[]) {

}

可以看到,mexFunction是没返回值的,它不是通过返回值把结果传回Matlab的,而是通过对参数plhs的赋值。mexFunction的四个参数皆是说明Matlab调用MEX文件时的具体信息,如这样调用函数时:

>> b = 1.1; c = 2.2;

>> a = add(b, c)

mexFunction四个参数的意思为:

nlhs = 1,说明调用语句左手面(lhs-left hand side)有一个变量,即a。

nrhs = 2,说明调用语句右手面(rhs-right hand side)有两个自变量,即b和c。

plhs是一个数组,其内容为指针,该指针指向数据类型mxArray。因为现在左手面只有一个变量,即该数组只有一个指针,plhs[0]指向的结果会赋值给a。

prhs和plhs类似,因为右手面有两个自变量,即该数组有两个指针,prhs[0]指向了b,prhs[1]指向了c。要注意prhs是const的指针数组,即不能改变其指向内容。

因为Matlab最基本的单元为array,无论是什么类型也好,如有double array、 cell array、 struct

array……所以a,b,c都是array,b = 1.1便是一个1x1的double

array。而在C语言中,Matlab的array使用mxArray类型来表示。所以就不难明白为什么plhs和prhs都是指向mxArray类型的指针数组。

完整的add.c如下:

// add.c

#include "mex.h" // 使用MEX文件必须包含的头文件

matlab调用c语言驱动函数,[转载]Matlab调用C语言函数相关推荐

  1. oracle怎么声明nvl函数,[转载]Oracle中的NVL函数

    Oracle中函数以前介绍的字符串处理,日期函数,数学函数,以及转换函数等等,还有一类函数是通用函数.主要有:NVL,NVL2,NULLIF,COALESCE,这几个函数用在各个类型上都可以. 下面简 ...

  2. php调用dll函数,[转载]matlab调用DLL中的函数

    首先,这种调用在 Matlab 的帮助文档中有说明.它的英文名称为: MATLAB Interface to Generic DLLs 从这个帮助文档,我们不难看出,整个过程为:加载 DLL ,调用相 ...

  3. matlab中griddata函数,[转载]matlab中griddata函数应用示例

    知道一系列点的坐标如下(1.486,3.059,0.1);(2.121,4.041,0.1);(2.570,3.959,0.1);(3.439,4.396,0.1);(4.505,3.012,0.1) ...

  4. MATLAB保存数据为dat格式,[转载] Matlab中的数据以.txt或.dat格式保存

    具体命令是: 使用save * .txt -asciix x是一个变量 *. txt是文件名,该文件存储在当前工作目录中,然后在打开后可以将其打开,数据可以以指数形式保存. 看下面的例子: a = [ ...

  5. matlab读int16读文件_[转载]Matlab中的textread textscan读取文本文件

    1.MATLAB从文本文件中读取格式化的数据函数是textread. 调用方式 [A,B,C,...] = textread('filename','format') [A,B,C,...] = te ...

  6. 采用Matlab编程实现 高频强调滤波,[转载]MATLAB图像处理-基于高频强调滤波和直方均衡化图像增强...

    摘要: 现代医学非常发达,能通过各种手段来获取人体的各种信息,例如,X光可以拍摄人的骨头等图片.但是,这些图片效果不一定很好,所以在使用着大量的数字成像和数字图片处理设备.那么,现在,我用Matlab ...

  7. matlab中单独存图_[转载]matlab中保存图片的方法

    matlab中保存图片的方法 一.一种是出来图形窗口后手动保存(这儿又可以分两种): 1 直接从菜单保存,有fig,eps,jpeg,gif,png,bmp等格式. 2 edit------〉copy ...

  8. matlab怎么输入二维数组,[转载]matlab中数组的输入

    1 matlab中数组的输入 在matlab中写数组,直接输入元素的数组,应用中括号[],成行向量时,元素之间用空格或逗号隔开,成列向量时,分列处用分号隔开,也可以对相应行向量作转置,为在中括号外加单 ...

  9. matlab的模型文件扩展名,[转载]matlab simulink基础知识

    Simulink 是面向框图的仿真软件. 7.1 演示一个Simulink 的简单程序 [例7.1]创建一个正弦信号的仿真模型. 步骤如下: (1) 在MATLAB 的命令窗口运行simulink 命 ...

最新文章

  1. MySql命令行创建和删除触发器
  2. springcloud ribbon 配置负载均衡策略以及自定义策略
  3. 无法加载安装程序库 wbemupgd.dll
  4. LC滤波器简单设计法 - 一文读懂LC滤波器简单设计方法及原理介绍,LC值计算方法...
  5. 内卷了!DAS、NAS、SAN区别和FC SAN存储
  6. 类c语言实验报告,内蒙古工业大学 C语言实验报告
  7. 发力大数据营销 神马搜索获年度最佳移动广告平台奖
  8. c#rs232与三菱通讯_三菱各系统的RS232通讯接口汇总
  9. Oracle PO ER Model
  10. android tee os,有关OP-TEE - 中文社区论区 - 中文社区 - Arm Community
  11. python二元函数图像在线绘制_用python绘制二元函数
  12. php 5.0入门系列教程 pdf,ThinkPHP5.0-快速入门手册(新手教程版).pdf
  13. 李峋同款 爱心动态代码 步骤教程,可自定义修改自己喜爱照片背景(附代码)
  14. html2day(合并单元格,有序、无序列表,input、select、textarea表单)
  15. java foreach 空指针_foreach循环报NPE空指针异常
  16. 软件工程课程周进度报告 第六周
  17. 计算机科学概论读后感
  18. 概率DP,递推(麻球繁殖,UVA 11021)
  19. 系统运维架构 DevOps
  20. c++ 字母a~z升序排列编号 字典序问题 递归

热门文章

  1. 腾讯TEG团队打造轻量级数据可视化工具——小马BI【强烈推荐大数据行业学习】
  2. 经典 MyBatis 面试题
  3. Hbase 01_初学必知
  4. BJUT算法设计与分析考试真题 无答案
  5. JVM系列之:String.intern的性能
  6. Leet Code OJ 171. Excel Sheet Column Number [Difficulty: Easy]
  7. 数据结构——绪论以及线性表的顺序表示
  8. 使用海康威视设备在Web端显示实时视频
  9. 01.elasticsearch-security_es鉴权机制
  10. 浅谈万进制算法与大数定理的结合(高精度乘除法,阶乘)