matlab 模块mex,[转载]MATLAB的mex接口
mex的适用情况:需要大量循环或者遍历,不想改写已有的C模块,这些情况下适用mex接口比较合适。
mex的环境要求:已安装MATLAB,已安装合适的C编译器。
mex使用:
首先在MATLAB中使用mex -setup设置工作环境和相应的配置文件。mex其他参数详见帮助。
对于需要使用mex接口的程序,文件的扩展名需要为c/cpp,然后用mex
filename进行编译。编译完成后会生成dll文件(7.1之前)或者mexw32文件(7.1之后)。
编译完成后,即可像m文件一样适用mex。
mex接口的结构:
//
#include "mex.h"
///
// Computational Routine //
///
// interface & function
declaration
return_type myFunc1(parameter1,
parameter2, ...);
return_type myFunc2(parameter1, parameter2, ...);
...
// interface & function
defination, implementation
void myMex(parameter1, parameter2,
...){
statements
}
return_type myFunc1(parameter1,
parameter2, ...){
statements
}
return_type myFunc2(parameter1,
parameter2, ...){
statements
}
...
/
// Gateway Routine //
/
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray
*prhs[]){
...
myMex(parameter list);
}
//
调用mex时,MATLAB将输入的数据通过入口子程序赋给输入参数指针,同时创建由输出参数指针指向的输出矩阵,然后将这些指针作为计算子程序的参数传递到计算子程序进行计算。
mexFunction在调用C函数时,直接使用指针传递参数是比较方便的,一方面需要计算的结果往往是一个矩阵而不是一个数,另一方面以值传递值返回的方式,同样需要赋值给mex接口的指针。
在mexFunction的参数中:
nlhs表示输出参数的个数
nrhs表示输入参数的个数
类型为mxArray的指针数组,用于指向输出的每个参数
类型为mxArray的指针数组,用于指向输入的每个参数
为了mex的正确执行,也是良好编程习惯的要求,需要对输入参数和输出参数进行个数和类型的检查:
mxGetClassID //获得指针所指变量类型
mxIsNumeric, mxIsCell等,检查指针所指变量是否为符合某种要求的变量类型。更多可查阅帮助。
参数检查过程中可使用mexErrMsgTxt输出错误信息。
mxGetM, mxGetN,获得矩阵的行数和列数
mxGetDimensions,获得矩阵维数
mxGetPr,mxGetPi,获得矩阵实数部分、虚数部分的指针
mxGetString, 获得字符串内容
mxGetElementSize, 获得存储矩阵元素所需要的字节数
mxCalloc,内存分配。用mxCalloc不用calloc和malloc,因为mxCalloc会自动释放内存,不需要手动free了。
mxCreateString, 创建1*N的字符串矩阵
mxCreateDoubleMatrix,
创建2维双精度浮点矩阵,可以是实数(mxREAL)或者复数(mxCOMPLEX)
mxCreateStructArray, 创建N维结构体矩阵
mxCreateCellMatrix, 创建二维单元矩阵
mxCreateNumericArray,创建n维数值矩阵
mexPrintf, 重新封装的printf
mxSetFiled, 设置结构体矩阵的域
mxSetCell, 设置单元矩阵的单元值
mxSetPr, 设置矩阵实数值
mxSetPi, 设置矩阵虚数值
mxCallMATLAB,
调用MATLAB中其他内建函数、自定义M文件、mex文件。
具体使用方法可查阅MATLAB帮助。
使用mex时的注意事项:
1.MATLAB调用mex接口时,将参数个数及参数指针传入接口子程序,由接口子程序完成指针和调用变量的赋值、输出数据的内存空间分配,接口子程序再将参数指针或经过赋值的变量作为参数传递给C的计算子程序,完成调用过程。调用时应注意指针所指对象的正确性,为处理正确最好做相应的强制类型转换。
2.mex并不便于调试,因此应在C的IDE中用测试集调试后再放入mex文件中。
3.MATLAB中指向二维及高维数组的指针递增方式是按行递增的,而C中是按列递增的,因此计算index时要注意位置。
下面给个我的例子:
/
#include "mex.h"
int LSB(int pixel);
int tier_score(int s_1,int s_2,int x_1,int x_2);
int add_sub_select(int pixel_1,int pixel_2);
void cost_matrix_gen_c(double *output,double *x,double
*len_x,double *y,double *len_y){
int
i,j;
int
s_1,s_2,x_1,x_2;
for
(j=0;j
x_1 = (int)*(y+j*2);
x_2 = (int)*(y+j*2+1);
for (i=0;i
s_1 = (int)*(x+i*2);
s_2 = (int)*(x+i*2+1);
*(output++)=tier_score(s_1,s_2,x_1,x_2);
}
}
}
int tier_score(int s_1,int s_2,int
x_1,int x_2){
int
score;
if
(s_1==LSB(x_1)){
if (s_2==add_sub_select(x_1,x_2)){
score = 20;
}
else{
score = 0;
}
}
else{
score = 0;
}
return
score;
}
int LSB(int pixel){
return
pixel%2;
}
int add_sub_select(int pixel_1,int
pixel_2){
return
LSB((int)pixel_1/2 + pixel_2);
}
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray
*prhs[]){
double
*y,*x,*output,*len_x,*len_y;
int
n_row,n_column;
if (nrhs !=
4 || nlhs != 1){
mexErrMsgTxt("invalid number of input/output arguments!");
}
//参数个数检查
n_row = mxGetM(prhs[0])>mxGetN(prhs[0]) ?
mxGetM(prhs[0]) : mxGetN(prhs[0]);
//获得输入向量元素个数
n_column = mxGetM(prhs[2])>mxGetN(prhs[2]) ?
mxGetM(prhs[2]) : mxGetN(prhs[2]);
//获得输入向量元素个数
n_row = n_row/2;
n_column =
n_column/2;
plhs[0] =
mxCreateDoubleMatrix(n_row,n_column,mxREAL);
//建立n_row*n_column大小的输出矩阵
output =
mxGetPr(plhs[0]); x=mxGetPr(prhs[0]);
len_x=mxGetPr(prhs[1]);
y=mxGetPr(prhs[2]);
len_y=mxGetPr(prhs[3]);
//获得输入、输出指针
cost_matrix_gen_c(output,x,len_x,y,len_y);
//调用计算函数
}
matlab 模块mex,[转载]MATLAB的mex接口相关推荐
- matlab灰度归一化,[转载]matlab图像处理为什么要归一化和如何归一化?
matlab图像处理为什么要归一化和如何归一化?一.为什么归一化 1. 基本上归一化思想是利用图像的不变矩寻找一组参数使其能够消除其他变换函数对图像变换的影响.也就是转换成唯一的标准形式以抵抗仿射变换 ...
- matlab msgbox 换行,[转载]Matlab/GUI笔记
转自 http://www.kylen314.com/archives/412 不显示坐标刻度: set(gca,'xtick',[]) =============================== ...
- matlab画图模糊,[转载]matlab中模糊工具箱的使用
用 Matlab 中的 Fuzzy 工具箱做一个简单的模糊控制,流程如下: 1.创建一个 FIS (Fuzzy Inference System ) 对象, a = newfis(fisName,fi ...
- matlab 比较日期,[转载][Matlab]关于时间的函数的不完全总结
一.日期和时间 三种表示格式 (1)日期字符串: NowDate=date NowDate = 08-Aug-2008 year(NowDate) %提取日期的年份 ans = 2008 (2)连续的 ...
- matlab中select,[转载]MATLAB阈值获取函数ddencmp、thselect、wbmpen和w
crit(t) wdcbm的调用格式有以下两种: (1)[THR,NKEEP]=wdcbm(C,L,ALPHA); (2)[THR,NKEEP]=wdcbm(C,L,ALPHA,M); 函数wdcbm ...
- matlab二进制操作,[转载]Matlab二进制类型数据相关操作
Matlab逻辑运算 &: 逻辑与 A&B 返回值:当A.B中元素均为非零元素是,返回1,否则,为0,还可表示成and(a,b); | :逻辑或 A|B.还可以表示成or(A,B). ...
- matlab xcorr lags,[转载]matlab中xcorr的用法
Matlab中用于计算自相关函数的指令是xcorr.比如矩阵A=[1 2 3]; xcorr(A)=3.0000 8.0000 14.0000 8.0000 3.0000 自相关函数是信号间隔的函数, ...
- MATLAB阶段性方程组,[转载]matlab 解方程组
1.解方程 最近有多人问如何用matlab解方程组的问题,其实在matlab中解方程组还是很方便的,例如,对于代数方程组Ax=b(A为系数矩阵,非奇异)的求解,MATLAB中有两种方法: (1)x=i ...
- matlab水汽计算公式,[转载]matlab 解方程组
1.解方程 最近有多人问如何用matlab解方程组的问题,其实在matlab中解方程组还是很方便的,例如,对于代数方程组Ax=b(A为系数矩阵,非奇异)的求解,MATLAB中有两种方法: (1)x=i ...
最新文章
- ASP.NET BookMark
- matlab神经网络4:数据聚类-自组织映射
- iconfont 图标宽高出问题_一个技巧,100,000,000+PPT图标就可以任性使用!【黑科技第11期】...
- 简单了解Vue的自定义组件与生命周期
- 每输入四个字符添加一个中划线
- C++:52---多重继承
- php注册树模式,PHP设计模式之注册树模式
- 用php做居中金字塔,[菜鸟学php] php版自定义函数实现金字塔
- Python中使用xpath结合contains
- Python之numpy模块array简短学习
- linux光盘挂载加载过程,如何在Linux系统下挂载光盘
- 属性篇(4)—If you love css …
- Windows 配置libjpeg-turbo并在python中调用
- 【MFC】测边网平差计算
- tbschedule
- android 数字 余额宝,仿余额宝数字滚动增长的效果实现
- isosurface matlab,[matlab][isosurface]画隐函数的等值曲线或曲面
- Mac上最好用的BT下载工具——Folx
- Column ‘XXX‘ cannot be null 问题解决方案
- matlab 风向玫瑰图
热门文章
- 【新闻解读2019年】四分类不能准确区分所有垃圾 市民建议用更直白的名称
- Leetcode——537. Complex Number Multiplication
- FME2012世界之旅——实时博客
- 惠斯通电桥与运算放大器的输入失调电流和输入偏置电流
- Python爬取系列妹子图实战总结(程序员节福利哟)
- 唯样商城:100年前的科技脑洞到底有多大?(第一个已经实现)
- Vue Loading插件
- ██最牛的抠图软件诞生了██_摄影作品
- 2021/12/01学习总结
- 华为认证——HCIA-IoT(V2.0)——物联网工程师-模拟试卷(答案)