编写 Matlab mexFunction (C mex)

article/2025/6/22 4:59:24

 

资料一 MATLAB的MEX文件编写和调试

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是输入参数相关的)。

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

b. 操作输入数据

对输入数据进行操作,需要通过MEX函数mxGetPr 得到数据的指针地址。 mxGetM 和 mxGetN 得到矩阵数据的行和列 (返回整数)。对于实矩阵,我们可以定义 double *M; 来对实矩阵数据操作(不过似乎是,plhs, prhs都是指向double类型的指针,所以下面的这个M等,都要定义成double*类型的)。如:

double *M;

int m, n;

M = mxGetPr(prhs[0]); // 指针指向第一个参数的数据地址

m = mxGetM(prhs[0]);

n = mxGetN(prhs[0]);

需要注意的是,MATLAB矩阵数据的存储顺序是"从上到下,从左到右"。也就是说对于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

打开Visual Studio 2008/2010/2012/2013, 新建项目, 选择MFC DLL.

a. 配置项目属性

打开项目属性配置页,选择配置属性目录,然后分别进行如下操作

VC++目录 -> 包含目录    加入MATLAB安装目录下的 \extern\include 路径。

VC++目录 -> 库目录       加入MATLAB的 \extern\lib\win32\microsoft 路径。

连接器 -> 输入 -> 附加依赖项   输入libmx.lib libeng.lib libmat.lib libmex.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(输入变量)

程序一旦被调用,就会被断在我们的断点处。接着你就可以像调试C++程序那样调试MEX程序了。(如果命令找不到,检查一下matlab当前路径,和path路径。)

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

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

 

资料二 深入

在使用MATLAB编译C/C++代码时,C/C++代码中要使用一个mexFunction函数,那么这个函数是如何定义,在编译时又是如何实现的呢?下面我将使用实例进行说明。

如一个简单的函数:

double add(double x, double y)

{

    return x + y;

 }

 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如下:

#include "mex.h"//使用mex文件必须包含头文件//执行具体工作的C函数
double 
文章来源:https://blog.csdn.net/weixin_30423977/article/details/97424977
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://chatgpt.dhexx.cn/article/USxfCkOo.shtml

相关文章

matlab和C/C++混合编程--Mex

最近的项目需要matlab和C的混合编程,经过一番努力终于完成了项目要解决的问题。现在就将Mex的一些经验总结一下,当然只是刚刚开始,以后随着学习的深入继续添加。首先讲讲写Mex的一些常规规定,然后我们会重点关注混合编程中最难解决…

R语言【多因素方差分析】

《R语言与大数据编程实战》 学习笔记

三、单因素方差分析例题(R语言)

题目 程序及结果 程序&#xff1a; X<-c(80,203,236,252,284,368, 133,180,100,160,200,195, 156,295,320,448,465,481, 194,214,272,330,386,475) A<-factor(rep(1:4,each6)) miscellany<-data.frame(X,A) aov.mis<-aov(X~A,datamiscellany) summary(aov.mis)…

SPSS教程:单因素重复测量方差分析,超详细图文教程

一、问题与数据 研究者想知道锻炼是如何降低心脏病发生风险的&#xff0c;于是他关注了一种与心脏病相关的蛋白——C反应蛋白&#xff08;C-Reactive Protein, CRP&#xff09;&#xff1a;CRP的浓度越高&#xff0c;发生心脏病的风险越高。研究者想知道锻炼对CRP浓度的影响。…

正交试验设计例题及答案_正交试验设计中的方差分析-例题分析

正交试验设计中的方差分析-例题分析 正交试验设计中的方差分析-例题分析 二&#xff0e;正交试验设计的方差分析的步骤和格式 * 三&#xff0e;实际应用举例 例8&#xff1a;用原子吸收光谱测定铝合金中痕量铁时&#xff0c;需要选择以下三个因素的最适宜条件&#xff1a;1)酸…

R语言双因素方差分析

R语言双因素方差分析 条件: 各个样本是相互独立的随机; 各个样本来自正态总体; 具有方差齐性; 用途: 检验两个或多样本均数间的差异有无统计学意义;注:本均数的比较可以采用 t检验或 F检验,两个以上样本均数的比较只 能用 F检验。 回归方程的线性假设检验; 检验两…

【数据分析】双因素方差分析

0.双因素方差分析的分类 无交互作用的方差分析 假定因素 A A A和因素 B B B的效应之间是相互独立的&#xff0c;不存在相互关系。有交互作用的方差分析 假定因素 A A A和因素 B B B的结合会产生出一种新的效应。 无交互作用的双因素方差分析 1.形式 假定要考察两个因素 A , …

【数据分析】单因素方差分析(含MATLAB和Python实现)

1.基本概念 试验指标&#xff1a;在试验中要考察的指标&#xff0c;如产品质量等。因素&#xff1a;影响试验指标的条件。包括可控因素和不可控因素。单因素试验&#xff1a;在一项试验中只有一个因素在改变的试验。多因素试验&#xff1a;在一项试验中多于一个因素在改变的试…

十六、 方差分析--使用Python进行双因素方差分析

双因素方差分析 对于两因素的方差分析&#xff0c;基本思想和方法与单因素的方差分析相似&#xff0c;前提条件仍然是要满足独立、正态、方差齐性。所不同的是在双因素方差分析中有时会出现交互作用&#xff0c;即二因素的不同水平交差搭配对指标产生影响。下面先讨论无交互作…

单因素试验固定效应模型方差分析

单因素试验固定效应模型方差分析 观测值的线性模型平方和与自由度分解例题与SPSS求解非平衡单因素试验SPSS求解 一、观测值的线性模型 单因素试验线性可加模型为&#xff1a; Yij为第i个处理的第j个观测值&#xff1b;U为所有观测值的平均值&#xff1b;Ti为第i个处理效应&am…

spss方差分析_SPSS统计案例:考虑交互作用的双因素方差分析

某工厂使用3种机型的机器生产同一款产品,现在老板想考察不同机型以及不同操作工人对产品的影响,为此他简单设计了一个小实验,让甲、乙、丙、丁四个工人操作机器Ⅰ、Ⅱ、Ⅲ各三天,其产品产量如下表所示,试分析工人和机器对产品产量是否有显著影响? 简单分析一下,机器有3个…

R语言——双因素方差分析

双因素方差分析&#xff0c;顾名思义&#xff0c;讨论有两种影响因素的样本的方差分析。 一、不考虑交互作用 1.代码示例 agriculture<-data.frame( Yc(325, 292, 316, 317, 310, 318, 310, 320, 318, 330, 370, 365), Agl(4,3), Bgl(3,1,12)); agriculture.aov <- ao…

双因素方差分析(R)

目录 原理 双因素等重复试验的方差分析 假设前提和模型设定 离差平方和分解 检验统计量和拒绝域 例题 应用 双因素无重复试验的方差分析 假设前提和模型设定 离差平方和分解 检验统计量和拒绝域 例题 应用 原理 在单因素方差分析的基础上&#xff0c;双因素方差分…

应用统计学方差分析之单因素方差分析原理解析(含Python代码)

基本概念&#xff1a; 在试验中&#xff0c;把考察的指标称为试验指标&#xff0c;影响试验指标的条件称为因素。因素可分为两类,-类是人为可控的测量数据&#xff0c;比如温度、身高等;一类是不可控的随机因素&#xff0c;例如&#xff0c;测量误差&#xff0c;气象条件等。因…

统计学——单因素方差分析

概念 方差分析&#xff1a;又称变异分析&#xff0c;是英国统计学家R.A.Fisher于1923年提出的一种统计方法&#xff0c;故有时也称为F检验。 可简写为ANOVA。用于多组均数 之间的显著性检验。 要求&#xff1a;各组观察值服从正态分布或近似正态分布&#xff0c;并且各组之间的…

单因素方差分析的计算步骤

假定实验或观察中只有一个因素&#xff08;因子&#xff09;A&#xff08;比如说试剂浓度&#xff09;&#xff0c;有m个水平。各在每一种水平下&#xff0c;做n次实验。 X i j X_{ij} Xij​表示第j个水平下的第i次实验。 实验次数A1水平A2水平…Am水平1 X 11 X_{11} X11​ X …

数据分析 第七篇:方差分析(单因素方差分析)

在试验中&#xff0c;把考察的指标称为试验指标&#xff0c;影响试验指标的条件称为因素。因素可分为两类&#xff0c;一类是人为可控的测量数据&#xff0c;比如温度、身高等&#xff1b;一类是不可控的随机因素&#xff0c;例如&#xff0c;测量误差&#xff0c;气象条件等。…

统计学 —— 单因素方差分析的应用与Excel实现

单因素方差分析的应用 前言概念:使用要求&#xff1a;基本思想&#xff1a;计算原理&#xff1a;分析步骤&#xff1a; 例题 前言 无论是什么活动&#xff0c;影响产品质量和产品的因素都有多种&#xff0c;如影响农作物产量的因素有品种、天气、施肥量、肥料的种类等等。如果…

R语言:方差分析之单因素方差分析和双因素方差分析

方差分析 方差分析(Analysis of Variance&#xff0c;ANOVA&#xff09;&#xff0c;是利用样本数据检验两个或两个以上的总体均值之间是否有差异的一种方法;&#xff08;缘起多个处理问题-即多个因变量&#xff09; 即若所有自变量对应的因变量的均值相等&#xff0c;则意味着…

方差分析(1) ——单因素方差分析及Excel示例

文章目录 什么是方差分析建立假设选择检验统计量偏差平方和 F F F检验统计量 给出拒绝域并做出判断 使用Excel进行方差分析添加数据分析工具使用分析工具库 结果说明 什么是方差分析 Wikipedia: Analysis of variance (ANOVA) is a collection of statistical models used to a…