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

article/2025/7/7 15:22:35

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

一、Mex的结构

先看一个简单的程序(该程序保存在matlab主目录下名字是mexDemon.cpp,或者在主目录下新建一个.cpp文件):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include "mex.h" 
//加入头文件,该头文件在VS2010中无法include,但是不影响其在matlab中的编译,反而在matlab编译还需要include它
#include <vector>
using  namespace  std;
void  mexFunction( int  nlhs, mxArray *plhs[], int  nrhs, const  mxArray *prhs[])
//mexFunction就类似于main函数
{
     //nlhs代表的是输出参数的个数
     //plhs是一个指针数组,里面的指针指向mxArray类型,每一个指针指向一个输出
     //nrhs代表的是输入参数的个数
     //prhs是一个指针数组,里面的指针指向mxArray类型,每一个指针指向一个输入
  vector<vector< double > > array2d;
     double  *z;
     plhs[0] = mxCreateDoubleMatrix( 5, 6, mxREAL); //第一个输出是一个5*6的矩阵
     z = mxGetPr(plhs[0]); //获得矩阵的第一个元素的指针
     array2d.resize(5);
     int  ii = 0;
     for ( int  i = 0; i < 5; i++){
         for ( int  j = 0; j < 6; j++){
             z[i*6 + j] = ii;  //指针访问矩阵是列优先的,请自己循环程序和分析输出结果
             ii++;
         }
     }
/*
  *ans =
      0     5    10    15    20    25
      1     6    11    16    21    26
      2     7    12    17    22    27
      3     8    13    18    23    28
      4     9    14    19    24    29
  */

然后对Matlab编译应用程序mex的编译器进行设置,在命令窗口输入 Mex –setup。 然后跟着步骤走选择合适的编译器即可。

设置完编译器之后在命令窗口输入Mex mexDemon.cpp 进行编译生成.mexw64文件,生成之后便可以直接调用了,例如本例子可以这样调用,就是直接在命令窗口输入 a = mexDemon(); 返回值如上。


 二、C和Matlab的数据结构的转换

(1)数值的传递

matlab -> c++

1
x = mxGetScalar(prhs[0]); //该函数获取matlab传递过来的数值;

 c++ -> matlab

plhs[0] = mxCreateDoubleMatrix(1,1,mxREAL);//创建返回的矩阵,范围plhs[0]为mxArray类型
y = mxGetPr(plhs[0]);//获取返回plhs[0]的数据地址,其后可以修改y的值就可以返回了

一个实例(numDemon.cpp):

1
2
3
4
5
6
7
8
9
10
11
#include "mex.h"
void  mexFunction( int  nlhs, mxArray *plhs[],  int  nrhs,  const  mxArray *prhs[]){
     int  x = mxGetScalar(prhs[0]);  //将第一个输入参数转为Scalar标量,也就是单数值
     printf ( "%d\n" , x);  //打印
     
     double  *y;
     plhs[0] = mxCreateDoubleMatrix(1,1,mxREAL);  //让第一个输出参数指向一个1*1的矩阵
     y = mxGetPr(plhs[0]);  //获得矩阵的第一个元素的指针
     *y = 10;  //将其赋值为10
}

 如下图在命令窗口编译:


 (2)矩阵的传入与传出

关于传出(c++到Matlab, 就是第一个例子),下面可以再给一个例子是如何从matlab传入到c++,看下面这段代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include "mex.h"
void  mexFunction( int  nlhs, mxArray *plhs[],  int  nrhs,  const  mxArray *prhs[]){
     double  *dataCursor;
     vector<vector< double > > parms;
     dataCursor = mxGetPr(prhs[0]);  //得到输入矩阵的第一个元素的指针
     int  mrows = mxGetM(prhs[0]);    //获得矩阵的行
     int  ncols = mxGetN(prhs[0]);    //获得矩阵的列
     printf ( "%d_%d\n" , mrows, ncols);   //打印行和列
     
     parms.resize(mrows);   //初始化
     for ( int  i = 0; i < mrows; i++){
         parms[i].resize(ncols);
     }
     for ( int  i = 0; i < mrows; i++){
         for ( int  j = 0; j < ncols; j++){
             parms[i][j] = dataCursor[j * mrows + i];  //拷贝矩阵的元素到vector of vector
         }
     }
}

 同样在命令窗口编译即可。

 


(3)字符串的传入与传出

matlab -> c++ (传入)

1
2
char  *input_buf;
input_buf = mxArrayToString(prhs[0]); //使用mxArrayToString将mxArray转换为c、c++字符串

 c++ -> matlab (传出)

1
2
3
4
5
char  *output_buf; //定义字符串缓存
size_t  buflen = (mxGetM(prhs[0]) * mxGetN(prhs[0])) + 1; //获取字符串长度,mxGetM获取行数,mxGetN获取列数
output_buf=mxCalloc(buflen,  sizeof ( char )); //使用mxCalloc分配输出字符串数组
plhs[0] = mxCreateString(output_buf); //使用mxCreateString创建mxArray输出
mxfree(output_buf);

 一个实例(strDemon.cpp)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include "mex.h"
void  revord( char  *input_buf,  size_t  buflen,  char  *output_buf)
{
   mwSize i;
   if  (buflen == 0)  return ;
  
   for (i=0;i<buflen-1;i++)
     *(output_buf+i) = *(input_buf+buflen-i-2);
}
void  mexFunction(  int  nlhs, mxArray *plhs[],
                   int  nrhs,  const  mxArray *prhs[])
{
     char  *input_buf, *output_buf;
     size_t  buflen;
    
     buflen = (mxGetM(prhs[0]) * mxGetN(prhs[0])) + 1;  //因为本程序是翻转字符串,所以输入输出字符串的长度应该一样
    
     output_buf=mxCalloc(buflen,  sizeof ( char ));  //申请空间
    
     input_buf = mxArrayToString(prhs[0]);  //获得输入字符串
    
     revord(input_buf, buflen, output_buf);  //翻转字符串
    
     plhs[0] = mxCreateString(output_buf);
     mxFree(input_buf);
     return ;
}

同样编译一下即可。 

 


(4)cell的传入

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include "mex.h"
void  mexFunction( int  nlhs, mxArray *plhs[],  int  nrhs,  const  mxArray *prhs[]){
     mwSize cellNdim = mxGetNumberOfDimensions(prhs[0]);  //这里介绍两个函数mxGetNumberOfDimensions和mxGetDimensions
     const  int  *cellColPtr = mxGetDimensions(prhs[0]);
     //mxGetDimensions: 就是返回一个指针ptr,每一个指针所指向的值是每一个维度的元素个数。例如有矩阵3*2的矩阵,那么*(ptr)为3,*(ptr+1)为2.
     //mxGetNumberOfDimensions: 返回mxArray的维度。
     int  cellNRow = *(label_dims);
     int  cellNCol = *(label_dims + 1);
     mxArray *ptr;
     ptr = mxGetCell(prhs[0], 0);  //获取cell的第0个元素,返回一个mxArray指针,第二个参数代表cell中元素的下标
     mxArray *cellOfCell;
     cellOfCell = mxGetCell(ptr, 0);     //当然cell里面可以还是cell,那么应该再样写
     mxArray *cellOfStr;
     char  *chTmp;
     cellOfStr = mxGetCell(prhs[0], 0);  //当然cell里面可以是字符串
     chTmp = mxArrayToString(cellOfStr);
     printf ( "%s\n" , chTmp);
}

 后面待补充结构体和cell数组的传出,暂时还没遇到这样的需求。再贴上几个参考网址:

1.http://blog.sina.com.cn/s/blog_9db9f81901013yv2.html

2.http://blog.sina.com.cn/s/blog_80202a090100uhup.html


http://chatgpt.dhexx.cn/article/ohaFt5fA.shtml

相关文章

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…

单因素方差分析模型

例题&#xff1a; 试分析温度对着色度的影响。 1.正态性检验&#xff08;ks检验&#xff09; a[0.981,0.964,0.917,0.6690.607,0.693,0.506,0.3580.791,0.642,0.810,0.7050.901,0.703,0.792,0.883]; b[1 1 1 1 2 2 2 2 3 3 3 3 4 4 4 4]; areshape(a,numel(a),1); for i1:4aia…