MATLAB实战 | MEX文件

应用接口是MATLAB与其他语言相互调用各自函数的方法,MEX文件使MATLAB程序中可以调用或链接其他语言编写的函数,而MATLAB引擎使其他语言程序中可以调用MATLAB函数。

01、MEX文件


MEX是MATLAB Executable的缩写,是MATLAB中用于调用其他语言编写的程序的接口。用其他语言编写的MEX程序经过编译,生成MEX文件,可以作为MATLAB的扩展函数。MEX文件能够在MATLAB环境中调用,在用法上和MATLAB函数类似,但MEX文件优先于MATLAB函数执行。下面以C++为例,介绍MEX库函数、MEX源程序的构成、编译MEX源程序以及调用MEX文件的方法。

1. MEX函数


MEX库函数用于MEX程序与MATLAB环境交换数据和从MATLAB工作空间获取相应信息。所有MEX函数均在MATLAB的子文件夹extern\include中的头文件mex.h得到声明。表1列出了C/C++语言常用MEX函数及功能。


■ 表1 C/C++语言常用MEX函数及功能

2. MEX文件源程序的建立


MEX文件源程序由如下两个部分组成。
(1) 入口子程序。入口子程序的默认名字mexFunction,其作用是在MATLAB系统与被调用的外部子程序之间建立联系,定义被MATLAB调用的外部子程序的入口地址、MATLAB系统和子程序传递的参数等。入口子程序的定义格式如下: 

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

 入口子程序有4个参数。nlhs定义输出结果的个数,plhs指向用于返回输出结果的变量,nrhs定义输入参数的个数,prhs指向存储输入参数的变量。prhs和plhs都是指向mxArray对象的指针,C++程序与MATLAB工作空间交换数据必须使用mxArray对象,对象各成员的值默认为double类型。
(2) 计算子程序。计算子程序包含所有完成计算功能的程序,由入口子程序调用。计算子程序的定义格式和其他C/C++子程序的定义格式相同。
头文件mex.h中包含了所有的MEX函数声明,因此在文件首部需要加入宏命令:

#include "mex.h"

 下面用一个实例说明MEX文件的基本结构。
【例1】用C++编写求两个数的最小公倍数的MEX文件源程序,并编译生成MEX文件。调用该MEX文件,求两个整数的最小公倍数。
程序如下:

# include "mex.h"
//求最小公倍数子程序
double com_multi(double *x,double *y){
int a, b, c, d; a = int(*x); b= int(*y); c=a>=b?a:b; d=c;
while (c%a!=0 || c%b!=0)
c=c+d; return c;
//入口子程序
void mexFunction( int nlhs, mxArray *plhs[ ], int nrhs, const mxArray *prhs[]){
double *result; int m,n, i;
//检查参数数目是否正确 if(nrhs!= 2) {
mexErrMsgTxt("输入参数应有两个!");return;
}
if(nlhs!= 1) {
mexErrMsgTxt("应有一个输出参数!");return;
//检查输入参数的类型 for(i= 0;i<2;i++){
m= int(mxGetM(prhs[i])); n = int(mxGetN(prhs[i]));
if( mxIsClass(prhs[i],"int") || !(m ==1 &&n==1)){
mexErrMsgTxt("输入参数必须是一个数.");
}
}
//准备输出空间
plhs[0] = mxCreateDoubleMatrix(1,1,mxREAL); result= mxGetPr(plhs[0]);//计算
*result= com_multi(mxGetPr(prhs[0]),mxGetPr(prhs[1]));

 将以上程序保存到当前文件夹,文件名为TryMex.cpp。


3. MEX文件源程序的编译


MEX文件源程序的编译需要具备两个条件:一是要求已经安装MATLAB应用程序接口组件及其相应的工具,另一个是要求有合适的C/C++语言编译器。
编译MEX文件源程序有两种方法:一是利用MATLAB提供的编译器,二是利用其他编译工具,如Microsoft Visual Studio。若使用MATLAB提供的编译器,则编译MEX源程序使用mex命令。例如,编译例1的MEX源程序,在MATLAB命令行窗口输入如下命令:

>> mex TryMex.cpp

系统使用默认编译器编译源程序,编译成功,将在当前文件夹下生成与源程序同名的MEX文件TryMex.mexw64。扩展名.mexw64表示生成的是一个可以在64位Windows系统下运行的MEX文件。
调用MEX文件的方法和调用M函数的方法相同。例如,在MATLAB命令行窗口输入以下命令测试上述MEX文件:

>> z = TryMex(8,34)
z = 136

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/184980.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

GEE:生成超链接方式下载影像

作者:CSDN @ _养乐多_ 本文将介绍如何使用Google Earth Engine(GEE)平台以生成下载超链接的形式下载遥感数据。 结果如下图所示,只需点击链接,即可下载数据到本地。 文章目录 一、函数详解二、代码示例一、函数详解 用法返回值Image.getDownloadURL(params, callback)Ob…

【Jmeter进阶】压力测试大杀器:Jmeter使用技巧与总结!

一、基本概念 1.线程组N&#xff1a;代表一定数量的并发用户&#xff0c;所谓并发就是指同一时刻访问发送请求的用户。线程组就是模拟并发用户访问。 2.Ramp-Up Period(in seconds)&#xff1a;建立所有线程的周期&#xff0c;就是告诉jmeter要在多久没启动所有线程&#xff…

CloudQuery x GBase,信创数据库管控革新之路

日前&#xff0c;杭州图尔兹信息技术有限公司自主研发的 CloudQuery 一体化数据库操作管控平台&#xff0c;已经和天津南大通用数据技术股份有限公司研发的南大通用安全数据库管理系统 [简称&#xff1a;GBase 8s] 完成兼容性测试&#xff0c;并获得兼容性认证证书。 现阶段&am…

红酒按照糖含量怎么分类?

我们常听人们形容葡萄酒为干型或甜型&#xff0c;这指的是葡萄酒的含糖量。不含糖就是干型&#xff0c;含糖少就是半干型&#xff0c;含糖多就是甜型&#xff0c;这是葡萄酒分类的一种——按糖量分。云仓酒庄的品牌雷盛红酒分享一般分为干型、半干型、半甜型、甜型四种。 云仓…

RocketMQ消息的一生

这篇文章我准备来聊一聊RocketMQ消息的一生。 不知你是否跟我一样&#xff0c;在使用RocketMQ的时候也有很多的疑惑&#xff1a; 消息是如何发送的&#xff0c;队列是如何选择的&#xff1f; 消息是如何存储的&#xff0c;是如何保证读写的高性能&#xff1f; RocketMQ是如何…

01-概述 - OpenCV介绍与环境搭建

目录 1、OpenCV概念 &#xff08;1&#xff09;OpenCV 的介绍 &#xff08;2&#xff09;图像处理&#xff08;Image Processing&#xff09; &#xff08;3&#xff09;OpenCV的架构和核心模块 2、开发环境搭建 3、代码与演示 1、OpenCV概念 &#xff08;1&#xff09;…

0基础能不能转行做网络安全?网络安全人才发展路线

最近有同学在后台留言&#xff0c;0基础怎么学网络安全&#xff1f;0基础可以转行做网络安全吗&#xff1f;以前也碰到过类似的问题&#xff0c;想了想&#xff0c;今天简单写一下。 我的回答是先了解&#xff0c;再入行。 具体怎么做呢&#xff1f; 首先&#xff0c;你要确…

2016年10月4日 Go生态洞察:HTTP追踪介绍

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

昇腾Atlas 200I DK A2实现安全帽识别

文章目录 环境依赖编译测试总结 环境依赖 软件版本说明获取方式mxVision5.0.RC2mxVision软件包获取方式Ascend-CANN-toolkit6.2.RC2Ascend-cann-toolkit开发套件包获取方式Ubuntu22.04 代码仓库地址&#xff1a; https://gitee.com/ascend/ascend_community_projects/tree/31…

RK WiFi部分信道在部分地区无法使用的原因

不同国家支持的WiFi信道不一样&#xff0c;需要正确设置wificountrycode 修改路径&#xff1a; device\rockchip\common\BoardConfig.mk 修改内容&#xff1a;androidboot.wificountrycodeXX 该属性会被解析为 ro.boot.wificountrycode framework层会在&#xff1a; framewor…

Oracle登录认证方式详解

文章目录 一、简介二、OS认证三、口令认证四、remote_login_passwordfile 详解 一、简介 在数据库管理中&#xff0c;登录认证是确保数据库安全性的重要环节。Oracle数据库提供 了两种认证方式&#xff0c;一种是“操作系统认证”&#xff0c;一种是“口令文件认证&#xff0c…

ate测试原理及ate测试系统(软件)知识科普 -纳米软件

ATE(Automatic Test Equipment)测试也叫自动化测试&#xff0c;通过计算机控制测试仪器对被测对象进行测试。以计算机编程代替人工测试&#xff0c;基于测试程序控制仪器并对待测品进行输入和输出信号检测分析&#xff0c;从而判断待测品的性能是否符合要求。 ATE测试需要根据测…

探索亚马逊云科技云存储服务的性能

文章作者&#xff1a;Libai 引言 随着企业越来越多地依赖云存储解决方案&#xff0c;确保存储性能的最佳状态变得至关重要。在本文中&#xff0c;我们将探讨在亚马逊云科技云存储服务上进行存储性能基准测试的重要性&#xff0c;以及如何帮助企业做出资源分配和优化的明智决策…

如何搭建Splunk Enterprise平台并结合内网穿透工具实现公网访问

文章目录 前言1. 搭建Splunk Enterprise2. windows 安装 cpolar3. 创建Splunk Enterprise公网访问地址4. 远程访问Splunk Enterprise服务5. 固定远程地址 前言 Splunk Enterprise是一个强大的机器数据管理平台&#xff0c;可帮助客户分析和搜索数据&#xff0c;以及可视化数据…

HCIA-RS基础-静态路由协议

摘要&#xff1a;静态路由是一种在网络中广泛应用的路由选择方案&#xff0c;它以其简单的配置和低开销而备受青睐。本文将介绍静态路由的配置方法、默认路由的设置、路由的负载分担和备份策略。通过学习本文&#xff0c;希望可以你能够掌握静态路由的基本概念和在华为模拟器中…

「周转箱」降低物料损耗的关键

仓储管理是企业物流系统中的重要组成部分&#xff0c;不仅涉及物品的存储、分拣、包装和配送&#xff0c;其服务质量和效率还将直接关系到企业的生产和经营效益。 在现代制造业中&#xff0c;降低物料损耗是企业追求高效生产和优化成本的关键目标之一。精益生产理念的实施为企…

华大基因助力乌兹别克斯坦精准医学发展,共筑健康丝绸之路

今年上半年&#xff0c;中国与中亚五国元首齐聚陕西西安&#xff0c;举办中国&#xff0d;中亚峰会。过去的20年里&#xff0c;中国已经成为中亚国家的主要投资来源国&#xff0c;总投资额接近400亿美元。乌兹别克斯坦是中国&#xff0d;中亚合作机制的重要参与者&#xff0c;乌…

详解Rust编程中的生命周期

1.摘要 生命周期在Rust编程中是一个重要概念, 它能确保引用像预期的那样一直有效。在Rust语言中, 每一个引用都有其生命周期, 通俗讲就是每个引用在程序执行的过程中都有其自身的作用域, 一旦离开其作用域, 其生命周期也宣告结束, 值不再有效。幸运的是, 在绝大多数时间里, 生…

成为AI产品经理——模型构建过程(上)

目录 一、背景 1.对内 2.对外 二、模型构建过程 1.模型设计 2.特征工程 ① 数据清洗 ② 特征提取 数值型数据 标签/描述类数据特征 非结构化数据&#xff08;处理文本特征&#xff09; 网络关系型数据 ③ 特征选择 ④ 训练集/测试集 一、背景 虽然产品经理不…

P7 C++指针

前言 指针是一个令很多人都很痛苦的内容&#xff0c;然而指针其实没有大家想象中的那么复杂。 对计算机来说内存就是一切&#xff0c;如果非要我说出编程中最重要的一件事&#xff0c;我可能会说是内存。 当你编写了一段程序并启动它时&#xff0c;所有的程序都被载入到内存…