在matlab中创建mex文件,创建 C 源 MEX 文件
C 函数 arrayProduct
以下代码定义 arrayProduct 函数,它将 1×n 矩阵 y 与标量值 x 相乘,并以数组 z 形式返回结果。您可以在 C++ 应用程序中使用这些相同的 C 语句。
void arrayProduct(double x, double *y, double *z, int n)
{
int i;
for (i=0; i
z[i] = x * y[i];
}
}
创建源文件
打开 MATLAB 编辑器,创建一个文件,并在 MEX 文件中记录以下信息。
/*
* arrayProduct.c - example in MATLAB External Interfaces
*
* Multiplies an input scalar (multiplier)
* times a 1xN matrix (inMatrix)
* and outputs a 1xN matrix (outMatrix)
*
* The calling syntax is:
*
*outMatrix = arrayProduct(multiplier, inMatrix)
*
* This is a MEX file for MATLAB.
*/
添加包含 MATLAB API 函数声明的 C/C++ 头文件 mex.h。
#include "mex.h"
将文件保存在您的 MATLAB 路径(例如 c:\work)中,并将其命名为 arrayProduct.c。您的 MEX 文件名称为 arrayProduct。
创建入口例程
每个 C 程序都有一个 main() 函数。MATLAB 使用入口例程 mexFunction 作为函数的入口函数。添加以下 mexFunction 代码。
/* The gateway function */
void mexFunction(int nlhs, mxArray *plhs[],
int nrhs, const mxArray *prhs[])
{
/* variable declarations here */
/* code here */
}
下表描述了 mexFunction 的输入参数。
参数说明nlhs输出(左侧)参数的数量,或 plhs 数组的大小。
plhs输出参数的数组。
nrhs输入(右侧)参数的数量,或 prhs 数组的大小。
prhs输入参数的数组。
验证 MEX 文件的输入和输出参数
使用 nrhs 和 nlhs 参数验证 MEX 文件输入和输出参数的数量。
要检查两个输入参数 multiplier 和 inMatrix,请使用以下代码。
if(nrhs != 2) {
mexErrMsgIdAndTxt("MyToolbox:arrayProduct:nrhs",
"Two inputs required.");
}
使用以下代码检查一个输出参数,即乘积 outMatrix。
if(nlhs != 1) {
mexErrMsgIdAndTxt("MyToolbox:arrayProduct:nlhs",
"One output required.");
}
使用 plhs 和 prhs 参数验证参数类型。以下代码将验证 multiplier(由 prhs[0] 表示)为标量。
/* make sure the first input argument is scalar */
if( !mxIsDouble(prhs[0]) ||
mxIsComplex(prhs[0]) ||
mxGetNumberOfElements(prhs[0]) != 1 ) {
mexErrMsgIdAndTxt("MyToolbox:arrayProduct:notScalar",
"Input multiplier must be a scalar.");
}
以下代码将验证 inMatrix(由 prhs[1] 表示)为 double 类型。
if( !mxIsDouble(prhs[1]) ||
mxIsComplex(prhs[1])) {
mexErrMsgIdAndTxt("MyToolbox:arrayProduct:notDouble",
"Input matrix must be type double.");
}
验证 inMatrix 为行向量。
/* check that number of rows in second input argument is 1 */
if(mxGetM(prhs[1]) != 1) {
mexErrMsgIdAndTxt("MyToolbox:arrayProduct:notRowVector",
"Input must be a row vector.");
}
创建计算例程
添加 arrayProduct 代码。以下函数是您的计算例程,即用于执行您希望在 MATLAB 中使用的功能的源代码。
void arrayProduct(double x, double *y, double *z, int n)
{
int i;
for (i=0; i
z[i] = x * y[i];
}
}
计算例程是可选的。您也可以将代码置于 mexFunction 函数块中。
编写代码以实现跨平台的灵活性
MATLAB 提供了基于平台表示整数大小值的预处理器宏 mwsize。计算例程将数组的大小声明为 int。将变量 n 和 i 的 int 声明替换为 mwsize。
void arrayProduct(double x, double *y, double *z, mwSize n)
{
mwSize i;
for (i=0; i
z[i] = x * y[i];
}
}
声明计算例程的变量
将以下变量声明置于 mexFunction 中。
声明输入参数的变量。
double multiplier; /* input scalar */
double *inMatrix; /* 1xN input matrix */
为输入矩阵的大小声明 ncols。
mwSize ncols; /* size of matrix */
声明输出参数 outMatrix。
double *outMatrix; /* output matrix */
稍后,将 mexFunction 参数赋给这些变量。
读取输入数据
要读取标量输入,请使用 mxGetScalar 函数。
/* get the value of the scalar input */
multiplier = mxGetScalar(prhs[0]);
使用 mxGetDoubles 函数指向输入矩阵数据。
/* create a pointer to the real data in the input matrix */
inMatrix = mxGetDoubles(prhs[1]);
使用 mxGetN 函数获取矩阵大小。
/* get dimensions of the input matrix */
ncols = mxGetN(prhs[1]);
准备输出数据
要创建输出参数 plhs[0],请使用 mxCreateDoubleMatrix 函数。
/* create the output matrix */
plhs[0] = mxCreateDoubleMatrix(1,ncols,mxREAL);
使用 mxGetDoubles 函数将 outMatrix 参数赋给 plhs[0]
/* get a pointer to the real data in the output matrix */
outMatrix = mxGetDoubles(plhs[0]);
执行计算
将参数传递给 arrayProduct。
/* call the computational routine */
arrayProduct(multiplier,inMatrix,outMatrix,ncols);
查看完整的源文件
将源文件与位于 matlabroot/extern/examples/mex 的 arrayProduct.c 进行比较。在编辑器中打开文件 arrayProduct.c。
有关使用 MATLAB 数据 API 的 C++ MEX 文件示例,请参阅 arrayProduct.cpp。有关使用此 API 创建 MEX 文件的信息,请参阅 C++ MEX 函数。
编译 MEX 函数
在 MATLAB 命令提示符下,使用 mex 命令编译该函数。
mex arrayProduct.c -R2018a
测试 MEX 函数
s = 5;
A = [1.5, 2, 9];
B = arrayProduct(s,A)
B =
7.5000 10.0000 45.0000
验证 MEX 文件输入参数
最好在调用 MEX 函数之前验证 MATLAB 变量的类型。要测试输入变量 inputArg 并在必要时将其转换为 double,请使用以下代码。
s = 5;
A = [1.5, 2, 9];
inputArg = int16(A);
if ~strcmp(class(inputArg),'double')
inputArg = double(inputArg);
end
B = arrayProduct(s,inputArg)
在matlab中创建mex文件,创建 C 源 MEX 文件相关推荐
- matlab 水平投影,科学网—Matlab中如何将投影信息写入到shape文件中 - 朱永超的博文...
在Matlab中保存shape格式数据时,没有具体的函数可以将投影信息直接写入到shape文件中,不过可以通过另外一种方式实现.看下shape格式的文件不难发现,shape文件的投影信息是一个单独的文 ...
- matlab中结束脚本运行_一个处理dump文件的小脚本
各位看官可以考虑关注下我的公众号:LAMMPS 爱好者 同时安利下我们物美价廉的0基础入门培训班,有兴趣的同学可以进公众号了解~ 注:本文由深圳先进研究院梁挺博士原创 今天给大家介绍一个我在处理 la ...
- 在matlab中使用APP designer创建多窗口APP
如果是创建两个窗口的APP,则需要设计两个独立的APP,并实现两个APP之间的信息传递,示例如下,在Display Plot界面点击Options按钮,会弹出一个界面Options,可以选择图形的大小 ...
- Matlab中结构体struct创建和使用
在项目上遇见了调用api接口,接口返回的信息为struct,故探讨一下matlab的struct结构体 1.struct结构体创建 创建结构体数组有两种方式,分别为直接创建和使用struct函数 1. ...
- matlab函数画图创建gui,如何在MATLAB中的函数内创建GUI?
build a GUI有多种方法,例如使用App Designer,GUIDE或以编程方式创建它(我将在下面说明此选项).了解GUI组件和 options available for sharing ...
- m 文件 dll matlab 中调用_利用USO服务将特权文件写入武器化
James Forshaw发现的DiagHub DLL loading技术已经非常有名了.每当你在Windows或一些第三方软件中发现SYSTEM权限的任意文件写漏洞时,你就可以用这一招来造成任意代码 ...
- 将matlab中工作去的数据保存为.mat文件
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.工作区 二.利用save保存data和map数据到dm.mat文件中 前言 提示:这里可以添加本文要记录的大概内容 ...
- VC调用matlab中定义的.m文件中的函数的实例
Matlab是一个强大的数学计算/仿真工具,其内置了很多实用的现成的函数,而且我们经常也自己定义很多m函数.但在很多情况下,我们不得不使用VC编程.那么,如何在VC中利用matlab的资源呢?在这里我 ...
- MATLAB GUI的CreateFcn如何创建
看MATLAB关于GUI代码的时候发现有一些function ×××_CreateFcn(hObject, eventdata, handles)函数,那么这类函数是如何创建出出来的呢? 首先在MAT ...
- MATLAB二维数组的创建与元素提取
1.二维数组(矩阵)的创建 1.1直接输入法 从键盘直接输入元素.输入规则如下: 矩阵元素必须在方括号内: 同行元素之间用空格或逗号隔开: 行与行之间用分号或回车符隔开: 元素可以是数值.变量.表达式 ...
最新文章
- python创建csv文件并写入-Python 将数据写入文件(txt、csv、excel)
- Service Mesh 最火项目 Istio 分层架构,你真的了解吗?
- java字符串 删除指定字符的那些事
- [html] 说说你对HTML元素的显示优先级的理解
- Facebook AI牛津提出带“轨迹注意力”的Video Transformer,在视频动作识别任务中性能SOTA!...
- php的登陆代码,PHP登陆页面完整代码
- java框架面试题及答案,年薪50W
- 【C++代码整洁之道】遗留系统之殇
- Aduino驱动SSD1306 OLED 显示图像
- VBScript 基础知识
- New Year Snowmen((贪心)map+优先队列)
- 中国民商·商人第一村水稻专属种植基地落户永吉县
- 阿里云盘内测邀请码是多少?阿里云盘邀请码获得方法
- micropython移植stm32f746_STM32L476和STM32F746的外部Flash复制文件速度对比
- nginx_tcp转发
- python datetime时间差_高考倒计时,聊聊Python的GUI
- 科力锐勒索拦截系统:解决勒索病毒“勒索+窃取”双重威胁的特效药!
- 论文笔记《Fully Convolutional Networks for Semantic Segmentation》
- Microsoft Project(微软Office软件高级版本组件)
- 第九届全国大学生光电设计竞赛——赛题1:基于智能手机的苹果糖度无损测量新手攻略指南