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

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

设计模式——行为型模式(二)

6.8 迭代器模式 6.8.1 概述 定义:提供一个对象来顺序访问聚合对象中的一系列数据,而不暴露聚合对象的内部表示。 6.8.2 结构 迭代器模式主要包含以下角色: 抽象聚合(Aggregate)角色:定义存储、添加、删除聚合元素以及创建迭代器对象的接口。具体聚合(ConcreteAggreg…

Bug小能手系列(python)_13: RuntimeError: CUDA error: device-side assert triggered CUDA kernel errors might

Python运行代码报错 0 引言1 报错原因2 解决思路3. 总结 0 引言 在运行 Python 代码时出现报错&#xff1a; RuntimeError: CUDA error: device-side assert triggered CUDA kernel errors might be asynchronously reported at some other API call,so the stacktrace below …

C/C++ 常用加密与解密算法

计算机安全和数据隐私是现代应用程序设计中至关重要的方面。为了确保数据的机密性和完整性&#xff0c;常常需要使用加密和解密算法。C是一种广泛使用的编程语言&#xff0c;提供了许多加密和解密算法的实现。本文将介绍一些在C中常用的加密与解密算法&#xff0c;这其中包括Xo…

Kafka-TopicPartition

Kafka主题与分区 主题与分区 topic & partition&#xff0c;是Kafka两个核心的概念&#xff0c;也是Kafka的基本组织单元。 主题作为消息的归类&#xff0c;可以再细分为一个或多个分区&#xff0c;分区也可以看作对消息的二次归类。 分区的划分为kafka提供了可伸缩性、水…

【Web】Ctfshow Thinkphp3.2.3代码审计(1)

目录 ①web569 ②web570 ③web571 ④web572 ①web569 基础考察 /index.php/Admin/Login/ctfshowLogin ②web570 提示找路由 查看附件源码 (config.php) 发现定义了一个可执行命令的路由规则 /index.php/ctfshow/assert/eval($_POST[1]) 1system(tac /f*); ③web571 提…

设备树是什么?

设备树&#xff1a; 设备树DTS(Device Tree Source) 描述设备信息的独立的文件。 为什么要引入设备树&#xff1f; 随着芯片的发展&#xff0c;Linux内核中就包含着越来越多这些描述设备的代码&#xff0c;导致Linux内核代码会很臃肿。因此引入了设备树文件&#xff0c;从…

手摸手Element-Plus组件化开发

前端环境准备 编码工具: VSCode 依赖管理:NPM 项目构建: Vuecli NPM的全称是Node Package Manager&#xff0c;是一个NodeJS包管理和分发工具&#xff0c;已经成为了非官方的发布Node模块&#xff08;包&#xff09;的标准。2020年3月17日&#xff0c;Github宣布收购npm&am…

大数据项目--学习笔记

新零售项目介绍 1&#xff0c;行业背景介绍 一&#xff0c;百货商店 百货商店是世界商业史上第一个实行新销售方法的现代大量销售组织。其新型销售方法有&#xff1a; 1&#xff0e;顾客可以毫无顾忌地、自由自在地进出商店&#xff1b; 2&#xff0e;商品销售实行“明码标价…

【brpc学习实践八】bvar及其应用

什么是bvar bvar是多线程环境下的计数器类库&#xff0c;支持单维度bvar和多维度mbvar&#xff0c;方便记录和查看用户程序中的各类数值&#xff0c;它利用了thread local存储减少了cache bouncing&#xff0c;相比UbMonitor(百度内的老计数器库)几乎不会给程序增加性能开销&a…

HarmonyOS安装三方库遇到的问题

使用开发电脑系统为&#xff1a;MacOS, 开发工具为&#xff1a;DevEco-Studio版本号3.1.1 Release。在控制栏使用终端工具输入命令&#xff1a;ohpm install ohos/lottie遇到的第一个问题如下图。 解决方案&#xff1a; 1、在首选项中找到ohpm的安装路径。 2、打开bash_profil…

java爱心代码,脱单必备

package com.example.test;import java.awt.Color;import java.awt.Font;import java.awt.Graphics;import java.awt.Image;import java.awt.Toolkit; import java.util.jar.JarOutputStream;import javax.swing.JFrame;class Cardioid extends JFrame {//定义窗口大小private …

⑩【Redis Java客户端】:Jedis、SpringDataRedis、StringRedisTemplate

个人简介&#xff1a;Java领域新星创作者&#xff1b;阿里云技术博主、星级博主、专家博主&#xff1b;正在Java学习的路上摸爬滚打&#xff0c;记录学习的过程~ 个人主页&#xff1a;.29.的博客 学习社区&#xff1a;进去逛一逛~ Jedis、SpringDataRedis、StringRedisTemplate…