MATLAB中MEX文件的编写与调试

***************************************************

更多精彩,欢迎进入:http://shop115376623.taobao.com

http://item.taobao.com/item.htm?spm=a1z10.5-c.w4002-9510581626.24.ZO6sko&id=43401674106
精通MATLAB混合编程视频讲解
MATLAB各类函数视频讲解
基于MATLAB的高等数学问题求解 
MATLAB函数速查视频讲解
面向对象C++视频教程

精通MATLAB混编编程demo及PDF 

QQ:2911984429

http://item.taobao.com/item.htm?spm=a1z10.5-c.w4002-9510581626.24.ZO6sko&id=43401674106


***************************************************


1. MEX的编写格式

写MEX程序其实就是写一个DLL程序,所以你可以使用C,C++,Fortran等多种编程语言来写。

编写MEX程序的编辑器可以使用MATLAB的代码编辑器,也可使用自己的C++编辑器,如VS2008等。

用MATLAB的编辑器的好处是,MEX函数会加粗高亮显示,这给程序编写带来便利,可惜无法动态调试。如用VC即可编译也可调试,比较方便。mex的编译结果实际上就是一个带输出函数mexFunction 的dll文件,所以会用VC编写和调试dll,就会用VC编写和调试MEX程序。

a. MEX文件格式

#include "mex.h"

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

}

四个参数分别用来输出和输入数据: nlhs 输出参数个数,plhs 输出参数指针 (nrhs和prhs是输入参数相关的)。

1、nlhs:一个int型变量,他与M文件中的nargout变量的作用一样,用于记录输出参数的个数,即matlab函数调用的左端变量个数

2、plhs:一个mxArray型指针数组,数组中的每个元素分别指向每个输出参数的起始地址。

3、nrhs:一个int型变量,与M文件中的nargin变量的作用一样,用于记录输入参数的个数,即matlab函数调用的右端变量的个数

4、prhs:一个mxArray型的指针数组,数组中的每个元素分别指向每个输入参数的起始地址。

在matlab启动MEX文件时,传递的参数就是mexFunction函数中的参数。例如;matlab调用一个名为fun的MEX函数,其格式为:[x,y]=fun[a,b,c]。此时,首先将函数的输入变量的个数赋给nrhs,此处是3;然后生成一个prhs矩阵,用来存放输入参数的起司地址,此处prhs(1)、prhs(2)、prhs(3),分别指向输入变量a、b、c的起始地址;再将函数的输出变量的个数赋给变量nlhs,此处是2;最后生成一个plhs矩阵,用来存放输出参数的起始地址,此处plhs(1)、plhs(2)分别指向输出变量x、y的起始地址。


注意: 我们对输出和输入参数的操作都是通过指针的方式进行的。(这点很容易理解,因为我们的计算结果是需要传递给MATLAB的,实际上我们传递的不是数据,而是指针。MATLAB可以通过这些指针,访问内存中的数据。)

b. 操作输入数据

对输入数据进行操作,需要通过MEX函数mxGetPr 得到数据的指针地址。 mxGetM 和 mxGetN 得到矩阵数据的行和列 (返回整数)。对于实矩阵,我们可以定义 double *M; 来对实矩阵数据操作。如:

double *M;

int m,n;

// 指针指向第一个参数的数据地址

M = mxGetPr(prhs[0]);

m = mxGetM(prhs[0]);

n = mxGetN(prhs[0]);

需要注意的是,MATLAB矩阵数据的存储顺序是"从上到下,从左到右"的,这点和Fortran是一样的。也就是说对于MATLAB的m x n的矩阵A。 A(1,1) 就是 *M,A(2,1) 就是 *(M+1) ,以此类推,A(i,j) 就是 *(M + m*(j-1) + (i-1)).

注意: MATLAB的指标从1开始,C的指标从0开始。

c. 操作输出数据

对于输出数据,我们需要首先分配内存空间,有专门的mex函数可以使用,如:

plhs[0] = mxCreateDoubleMatrix(m,n, mxREAL); //生成m x n 的实矩阵。

同输入数据一样,要对输出数据操作,我们也需要一个指向数据的指针变量,如

double *A;

A = mxGetPr(plhs[0]);

下面介绍一下如何使用VS2008编写MEX并编译调试。

2. VC中编写MEX

打开VS2008, 新建项目, 选择MFC DLL.

a. 配置项目属性

打开项目属性配置页,C++ -> 附加包含目录 加入MATLAB安装目录下的 \extern\include 路径。

连接器 -> 附加库目录 加入MATLAB的 \extern\lib\win32\microsoft 路径。

连接器 -> 输入 -> 附加依赖项 输入libmx.lib libeng.lib libmat.lib libmex.lib 这四个lib文件。

b. 编辑输出函数

在项目源文件的. def 中EXPORTS段加入 mexFunction, 如:

EXPORTS
    ; 此处可以是显式导出
    mexFunction

c. 编写MEX文件

项目文件中新建一个C++文件 如 mexproc.cpp,里面按前面介绍的格式编写代码即可。

d. VC编译MEX

像编译其他程序那样直接编译即可,成功会生成dll文件。如果编译链接时出错,根据错误提示,检查一下lib和h的路径是否正确,有无缺少lib文件,代码是否有语法错误等。

3. VC中调试MEX

要调试MEX程序就要先编译,再调用她。所以我们需要在MATLAB中调用这个函数,并在VC的MEX程序相应位置处下断点即可。调用的函数名就是dll的主文件名,你可以根据自己的需要改名。我们用mymexfun.dll为例,先在VC的 mexFunction 函数代码段开始处F9下断。然后Ctrl+Alt+P附加MATLAB.exe进程。这样就可以运行命令调试程序了。我们可以在MATLAB的命令行里输入命令:

          [输出变量] = mymexfun(输入变量)

(如果命令找不到,检查一下matlab当前路径,和path路径。)

程序一旦被调用,就会被断在我们的断点处。接着你就可以像调试C++程序那样调试MEX程序了。

在MATLAB中编译MEX可以输入: mex 文件名.cpp

MATLAB上编译MEX时,你可以选择不同的编译器如lc, gcc等。也可以在编译时附加lib和h文件。关于mex的命令详解请参考MATLAB帮助文档。

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

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

相关文章

数据库设计思考

一:没有完美的数据库设计,只有符合业务的数据库设计! 二:我们的数据库设计,在遵守标准(三大范式)的同时也要考虑客户的体验! 有用户才有天下! 三:数据库设计时…

performSegueWithIdentifier:sender里边的sender是啥意思

performSegueWithIdentifier:sender里边的sender是啥意思啊?怎样用啊? [self performSegueWithIdentifier:"pushSign" sender:self]; [self performSegueWithIdentifier:"pushSign" sender:sender]; [self performSegueWithIdent…

java wrapper怎么运行_如何从智能合约中生成Java Wrapper

在本文中,我们将了解如何直接从智能合约生成Java Wrapper类以与Java中的智能合约进行交互。从智能合约生成Java Wrapper类有不同的方法:1. Web3j命令行工具和solc2. Web3j命令行工具和Truffle构建生成的工件3. web3j-maven-plugin4. web3j-gradle-plugin…

Hive 1.2.1SparkSqoop安装指南

目录 目录 1 1. 前言 1 2. 约定 2 3. 服务端口 2 4. 安装MySQL 2 4.1. 安装MySQL 2 4.2. 创建Hive元数据库 4 5. 安装步骤 5 5.1. 下载Hive 1.2.1二进制安装包 5 5.2. 安装Hive 5 5.3. 安装MySQL-Connector 5 5.4. 修改配置 5 5.4.1. 修改/etc/profile或~/.profile 5 5.4.2. 修…

Matlab与C/C++混合编程调用OpenCV

*************************************************** 更多精彩,欢迎进入:http://shop115376623.taobao.com http://item.taobao.com/item.htm?spma1z10.5-c.w4002-9510581626.24.ZO6sko&id43401674106 精通MATLAB混合编程视频讲解 MATLAB各类函数…

STL--排序与检索

题目 现有N个大理石,每个大理石上写了一个非负整数。首先把各数从小到大排序,然后回答Q个问题。每个问题是否有一个大理石写着某个整数x,如果是,还要回答哪个大理石写着x。排序后的大理石从左到右编写为1-N。(样例中,…

体验LESS CSS 框架

LESS基于NODE.JS的一种框架性语言,它可以更好更快捷的来搭建网站框架结构; 而后LESS 将 CSS 赋予了动态语言的特性,如 变量, 继承,运算, 函数. LESS 既可以在 客户端 上运行 (支持IE 6, Webkit, Firefox)&a…

java添加按钮点击事件_如何为odoo 10中的按钮点击事件添加一个java脚本处理程序?...

我想使用java脚本为header中的按钮创建一个处理程序。下面我视图模型给出:如何为odoo 10中的按钮点击事件添加一个java脚本处理程序?inherit_id"web.assets_backend">rel"stylesheet">my_pet_store_formpetstore.messageformc…

LeetCode(53):Maximum Subarray

Maximum Subarray: Find the contiguous subarray within an array (containing at least one number) which has the largest sum.For example, given the array [−2,1,−3,4,−1,2,1,−5,4],the contiguous subarray [4,−1,2,1] has the largest sum 6. 题意:找…

孩子教育

看了一圈学区房,基本上把浦东各个一流二流学校全看一遍了,大体下来觉得未必非要到一流学校附近买学区房,主要是家庭经济条件不允许,再者我和老公希望孩子在小学培养读书的习惯,而不是天天做试卷。所以一流学校和二流学…

python 程序打包 vscode_使用VScode编写python程序并打包成.exe文件

听说Visual Studio Code(VS Code)的诸多好处,了解了一下果真很喜欢,我喜欢它的缘由主要有3个,一是VS Code开源且跨平台,二是由于其界面很是酷,三是能够知足个人大所属代码需求,除此以外固然还有强大的好奇心…

使用命名空间、头文件和实现文件

*************************************************** 更多精彩,欢迎进入:http://shop115376623.taobao.com *************************************************** 2.3 使用命名空间、头文件和实现文件 使新的throttle类满足程序的需求将是非常…

Permissions for id_rsa are too open

为什么80%的码农都做不了架构师?>>> Last week I was lucky enough to have my laptop upgraded (yay SSD) which meant I needed to configure a new install of OSX Lion. Most of my files are stored online (email, documents, code, etc) but I m…

java看图_看图吧,Java

package salary;import java.awt.*;import javax.swing.*;import java.awt.event.*;import java.text.NumberFormat;public class Salary extends JFrame{//声明标签private JLabel numl;private JLabel basel;private JLabel salel;//声明文本框private JTextField numf;priva…

解决端口占用

tomcat启动时报错: 这说明8080端口已被其他程序占用,先用命令提示符 "netstat -ano" 显示端口,再在结果中找到端口,然后根据其PID再输入"tasklist"命令,在结果中查找其对应程序,就可知…

Python笔记-第一天

1。Python的输出print函数要把输出的字符串用单引号或者双引号括起来,但是不能混用。比如print(hello,world)和print("hello,world")是相同的。2.大小写敏感。3.由于缩进使用空格,复制代码不再那么方便。4.我在notepad中设置了Tab自动转化为4个…

Saltstack 报错 python-crypto randomPool_DeprecationWarning:

执行saltstack 报错一下信息根据报错信息修改python文件#若遇报错1#Starting salt-master daemon: /usr/lib64/python2.6/site-packages/Crypto/Util/number.py:57: PowmInsecureWarning: Not using mpz_powm_sec. You should rebuild using libgmp > 5 to avoid timing at…

java接口源码_java collection接口源码

package java.util;/** 1.Collection接口是集合继承关系中的根接口(root interface),有些集合允许重复元素,* 有些集合有序,JDK不提供本接口的实现,只提供子接口的实现(例如Set,List)* 2.所有实现Collection(或者其子接口)的类都必须包含两个…

结构体的嵌套问题

*************************************************** 更多精彩,欢迎进入:http://shop115376623.taobao.com *************************************************** 结构体的自引用(self reference),就是在结构体内部,包含指向自…

cocos2dx 3.x Value、Vector和Map意识

1. Value cocos2d::Value 这包括一个非常大的数字原生类型&#xff08;int,float,double,bool,unsigned char,char* 和 std::string&#xff09;外 加std::vector<Value>, std::unordered_map<std::string,Value> 和 std::unordered_map<int,Value> 的类。 你…