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 文件相关推荐

  1. matlab 水平投影,科学网—Matlab中如何将投影信息写入到shape文件中 - 朱永超的博文...

    在Matlab中保存shape格式数据时,没有具体的函数可以将投影信息直接写入到shape文件中,不过可以通过另外一种方式实现.看下shape格式的文件不难发现,shape文件的投影信息是一个单独的文 ...

  2. matlab中结束脚本运行_一个处理dump文件的小脚本

    各位看官可以考虑关注下我的公众号:LAMMPS 爱好者 同时安利下我们物美价廉的0基础入门培训班,有兴趣的同学可以进公众号了解~ 注:本文由深圳先进研究院梁挺博士原创 今天给大家介绍一个我在处理 la ...

  3. 在matlab中使用APP designer创建多窗口APP

    如果是创建两个窗口的APP,则需要设计两个独立的APP,并实现两个APP之间的信息传递,示例如下,在Display Plot界面点击Options按钮,会弹出一个界面Options,可以选择图形的大小 ...

  4. Matlab中结构体struct创建和使用

    在项目上遇见了调用api接口,接口返回的信息为struct,故探讨一下matlab的struct结构体 1.struct结构体创建 创建结构体数组有两种方式,分别为直接创建和使用struct函数 1. ...

  5. matlab函数画图创建gui,如何在MATLAB中的函数内创建GUI?

    build a GUI有多种方法,例如使用App Designer,GUIDE或以编程方式创建它(我将在下面说明此选项).了解GUI组件和 options available for sharing ...

  6. m 文件 dll matlab 中调用_利用USO服务将特权文件写入武器化

    James Forshaw发现的DiagHub DLL loading技术已经非常有名了.每当你在Windows或一些第三方软件中发现SYSTEM权限的任意文件写漏洞时,你就可以用这一招来造成任意代码 ...

  7. 将matlab中工作去的数据保存为.mat文件

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.工作区 二.利用save保存data和map数据到dm.mat文件中 前言 提示:这里可以添加本文要记录的大概内容 ...

  8. VC调用matlab中定义的.m文件中的函数的实例

    Matlab是一个强大的数学计算/仿真工具,其内置了很多实用的现成的函数,而且我们经常也自己定义很多m函数.但在很多情况下,我们不得不使用VC编程.那么,如何在VC中利用matlab的资源呢?在这里我 ...

  9. MATLAB GUI的CreateFcn如何创建

    看MATLAB关于GUI代码的时候发现有一些function ×××_CreateFcn(hObject, eventdata, handles)函数,那么这类函数是如何创建出出来的呢? 首先在MAT ...

  10. MATLAB二维数组的创建与元素提取

    1.二维数组(矩阵)的创建 1.1直接输入法 从键盘直接输入元素.输入规则如下: 矩阵元素必须在方括号内: 同行元素之间用空格或逗号隔开: 行与行之间用分号或回车符隔开: 元素可以是数值.变量.表达式 ...

最新文章

  1. python创建csv文件并写入-Python 将数据写入文件(txt、csv、excel)
  2. Service Mesh 最火项目 Istio 分层架构,你真的了解吗?
  3. java字符串 删除指定字符的那些事
  4. [html] 说说你对HTML元素的显示优先级的理解
  5. Facebook AI牛津提出带“轨迹注意力”的Video Transformer,在视频动作识别任务中性能SOTA!...
  6. php的登陆代码,PHP登陆页面完整代码
  7. java框架面试题及答案,年薪50W
  8. 【C++代码整洁之道】遗留系统之殇
  9. Aduino驱动SSD1306 OLED 显示图像
  10. VBScript 基础知识
  11. New Year Snowmen((贪心)map+优先队列)
  12. 中国民商·商人第一村水稻专属种植基地落户永吉县
  13. 阿里云盘内测邀请码是多少?阿里云盘邀请码获得方法
  14. micropython移植stm32f746_STM32L476和STM32F746的外部Flash复制文件速度对比
  15. nginx_tcp转发
  16. python datetime时间差_高考倒计时,聊聊Python的GUI
  17. 科力锐勒索拦截系统:解决勒索病毒“勒索+窃取”双重威胁的特效药!
  18. 论文笔记《Fully Convolutional Networks for Semantic Segmentation》
  19. Microsoft Project(微软Office软件高级版本组件)
  20. 第九届全国大学生光电设计竞赛——赛题1:基于智能手机的苹果糖度无损测量新手攻略指南

热门文章

  1. linux分析windows病毒,一个Linux病毒的原型分析
  2. 【NOI2008】 奥运物流
  3. 机器人感知与规划笔记 (6) - 运动控制与编程
  4. 计算机控制系统网络化的发展趋势,计算机控制系统发展趋势.doc
  5. iOS苹果官方Demo合集
  6. AliOS-Things--linkkitapp (6)打印日志
  7. Python常见报错及解决方案,BUG拯救指南
  8. 使用BeautifulSoup进行解析数据
  9. PTA 5-13 日K蜡烛图 (15分)
  10. 简单使用Google Agera框架