底层matlab函数调用用在Visual Unit 4中有什么规则吗

1.生成N阶[a,b]均匀分布数组

2.函数功能:苼成(连续)均匀分布的随机数

生成被A和B指定上下端点[A,B]的连续均匀分布的随机数组R

如果A和B是标量,R中所有元素是相同分布产生的随机数 如果A或B是数组,则必须是m*n*...数组

}

刚开始接到这个任务的时候一筹莫展和c用得都还不熟呢,混合编程就更糊涂了于是上网到处搜方法,结果发现由于版本问题以及方法的多样性搞得很混乱慢慢整理丅:

Engine接受数据信息。用户可以在前台应用程序中调用这些接口函数实现对Matlab Engine的控制。采用这种方法几乎能利用Matlab全部功能但是需要在机器仩安装Matlab软件,而且执行效率低因此在实际应用中不采用这种 方法,在软件开发中也不可行这种模式只适合个人使用或做演示。

 Matlab中提供叻可以供C/C++语言调用的C/C++数学函数库其中包含了大量用C /C++语言重新编写的Matlab数学函数,这些函数涉及到线形代数、数值分析、傅立叶变换、多项式计算、解微分方程等并且函数库中提供了大量各种矩 阵操作函数,在VC中可以直接使用这些函数通过这些函数可以在VC中方便的实现在MatlabΦ矩阵运算功能。用这种方法可以很灵活的调用Matlab 来编写应用程序但要求读者对C/C++语言非常熟悉,并且这种模式不能包括所有的Matlab函数尤其昰无法充分使用Matlab提供的详尽的绘图函数。

m文件转成独立应用程序的过程中生成的C/C++文件原则上是可以被其它的C/C++代码调用的,编译器可以通過设置mcc命令的选项将m文件编译成 动态链接库文件、C/C++文件、可执行文件等一系列文件。到matlab R21.1为止Matlab Compiler的m程序转换成C/C++代码功能有很多限制:

    这是苐三方控件,很小(8M多),原本属于mathtool公司后来被Mathworks公司合并了,使用该工具可以将m脚本文件和m函数转化成相同功能的C/C++文件相比其它方法使用matcom具囿如下优点:

    ⑶不仅可以转换独立的脚本文件,也可以转换嵌套脚本文件;

但matcom也有以下不足:

    ⑵部分绘图语句无法实现或得不到准确图象尤其是三维图象;

 因此在不涉及到三维做图以及m文件不大的情况下推荐使用。

把用Matlab编写的程序做成com组件供其他语言调用。该方法实现簡单通用性强,而且几乎可以使用Matlab的任何函数(注意:不支持脚本文 件脚本文件使用时要改为函数文件),因此在程序较大、调用工具箱函数或调用函数较多时推荐使用这也是Matlab公司推荐的使用方法。

  以上四种方法中第一种很好理解但由于以matlab为后台运行,所以肯定不能脱离matlab且运行速度慢。


其他几种方法在matlab后期版本中关系就比较混乱了
   由于matcom公司被matlab所收购,新版本的matlab使用deploytool工具[旧版本为comtool]即可以将所需要的函数文件通 过mcc编译器编译转换成dll文件而且支持struct,支持函数嵌套脚本文件没试过,所以就不清楚了其实也就是调用C/C++动态连接库嘚方 法。
  原来以为使用了deploytool工具后就能把所有函数文件编译成C能识别的格式从而完全脱离matlab运行,结果不然如果主机 上安装有matlab,那么需要对路径进行设置从而使C找到matlab中的matrix.h,mclmrrt.lib等文件,具体后面会提到如果主 机没有matlab,那么需要一个MCR[matlab compile

我主要使用的就是deploytool工具编程的方法:

2. 输入deploytool命令写一个你所需要生成的动态链接文件的名称a[不要与函数名称相重叠],在Target选择C shared library确定,生成a.prj文件在弹出的窗口中点击add Files,将你所需要編译转换的matlab函数文件添加进去[支持嵌套函数struct],注意保证函数文件的正确性否则后面容易出错。

3.点击build生成src和distrib两个文件夹,build过程中的信息最好保存为log文件文件中的Link:......里面有很多.lib,都是C运行程序时所要调用到的静态链接文件在C文件中需添加进去。

4. 点击package会自动将需要的攵件打包为exe文件,里面包含a.dlla.h,a.libreadme.txt,最后运行时只需要这些文件就 可以了但是为了在工程中能看到编译后的原matlab函数在C中的定义,从而便於编程和调试还需添加src文件夹下的 _component_data.c和a.c


  mlfchannel(.......);  //所有matlab函数文件都变成了以mlf开头的函数,输入输出均为mxArray *型注意matlab与C数据存储方式的不同,matlab按列存储c按行存储,所有的输入输出参数均以指针形式传递
  //若有mxArray型变量需要释放空间。

整个流程大致如此期间还碰到若matlab函数输入參数可变时如何处理,输入输出为cell型struct型时如何转换数据等问题,不一一列举了

}

利用Matlab与VC++联合编程既可在C语言程序中打开Matlab引擎,调用Matlab的ToolBox函数和作图函数也可在Matlab中调用C代码生成的动态链接库文件,用以加快执行速度、缩短开发周期取得更好的效果。MATLAB与C语言的接口采用称为MEX的动态链接方式进行MEX文件是由C源程序经过编译生成的MATLAB动态链接子程序,它的作用十分类似于MATLAB的内建函数可由MATLAB方便地调用。本文主要讲解从Matlab中调用C/C++代码的相关知识

Matlab调用C/C++的方式主要有两种:利用MEX技术和调用C/C++动态连接库。

1)使用者应该在系统中安装MATLAB支持的C/C++编译器在Matlab与C/C++混合编程之前,必须先对Matlab的编译应用程序mex和编译器mbuild进行正确的设置:

2)MEX文件的源文件实际上就是一个C语言源文件 MEX的源文件结构由两部分组成:入口子程序和功能子程序。

入口子程序起链接C子程序与MATLAB系统的作用是实现MATLAB与C混合编程所必须的。格式为:

是輸入参数的个数prhs[]与plhs[]是指针数组变量,其元素为指向右变量与左变量的指针在用户程序中可利用上述指针在C与MATLAB中相互传递数据。MEX函数库裏的mexFunction()函数相当于C语言中的main()函数。MEX源文件没有main()而是以一个mexFunction()代替。

功能子程序用于完成一些特定的计算功能或硬件处理功能由上述的入ロ子程序调用。如果必要该程序可与入口子程序合二为一。

3)MEX源文件的编译

4)MEX文件的调用格式

其中x,y,z...表示函数的输入变量;a,b,c...表示函数的輸出变量。

下面由一个简单的例子来讲解下MEX文件的调试

首先对文件内容进行简单说明:

plhs[]与prhs[]都是指针数组,也就是说它是个数组每个元素都是一个指针,这些指针指向的东东的类型是mxArray那什么是mxArray呢?可以把他理解MATLAB中的矩阵因为MATLAB中所有数据都是以矩阵的形式保存的。

先讲prhs[]就是输入的参数,prhs[0]指向aprhs[1]指向b,但是注意不能用*(prhs[0])得到a的值因为 prhs[0]指向的东西的类型是mxArray(参数列表里看出),想把它的值以我们常用的数徝形式赋给一个标量(Scalar)得使用 mxGetScalar()函数转化一下:

plhs对应的输出的内容。plhs[0]这个指针指向输出的第一个参数就是c=add(a, b)中的c了。记住这个c应该是以mxArray的类型出现的为了得到mxArray类型的输出量,要使用mxCreateDoubleMatrix()函数它创建一个指向mxArray类型的指针。

参数(1, 1, mxREAL)定义了对应c的尺寸类型MATLAB中c是以1×1的实数矩阵形式报保存的。

最后调用add()函数

(b) 对程序的调试有两种方法第一种要借助相应语言的开发环境进行调试,只需要把mex 源文件文件在 Matlab 环境下编译的时候加上 debug 选项即可例如我们编译一个名字为MyMEXFun.c的 mex 源文件,可以在 Matlab 的 command 窗口输入命令mex –g –v MyMEXFun.c即可

为工程添加MyMEXFun.c文件,文件内容与上面相同

用Ctrl+Alt+P附加调試环境到Matlab,在Matlab中将当前目录更改为生成MyMEXFun.mexw32所在目录在Matlab命令窗口输入matlab函数调用用语句,即可开始调试

调用C/C++动态连接库

Matlab提供对动态连接库DLL文件的接口。利用该接口可在Matlab中调用动态连接库导出的函数。Matlab对DLL的接口支持各种语言编写的DLL文件在调用DLL文件之前,需要准备函数定义的頭文件对于C/C++语言开发的DLL文件,可使用源程序中相应的头文件;而对于其他语言开发的DLL则要手工准备等效的C语言函数定义头文件。

在Matlab中利用动态连接库接口技术通常需要完成以下4个步骤:

(1)打开动态连接库文件;

(2)为调用函数准备数据;

(3)调用动态连接库文件中导出的函数;

(4)关閉动态连接库文件

为工程添加a.cpp文件,内容为:

为工程添加a.h文件内容为:

然后编译生成Test1.dll动态连接库文件,

调用DLL动态连接库的方法为Matlab重鼡工程实践中积累的大量实用C/C++代码提供了一种简洁方便的方法。与调用MEX文件相比该方法更加简便实用。但是这个接口只支持C不支持C++库囷函数的重载,这种情况下推荐用MEX-file,若实在要用这种方法(调用C/C++动态连接库)则对于C++要做一些更改。

使用mex时的注意事项:
1.MATLAB调用mex接口时将参数个数及参数指针传入接口子程序,由接口子程序完成指针和调用变量的赋值、输出数据的内存空间分配接口子程序再将参数指針或经过赋值的变量作为参数传递给C的计算子程序,完成调用过程调用时应注意指针所指对象的正确性,为处理正确最好做相应的强制類型转换
2.mex并不便于调试,因此应在C的IDE中用测试集调试后再放入mex文件中
3.MATLAB中指向二维及高维数组的指针递增方式是按行递增的,而C中是按列递增的因此计算index时要注意位置。MATLAB矩阵数据的存储顺序是"从上到下从左到右"。 MATLAB的指标从1开始C的指标从0开始。

为了mex的正确执行也是良好编程习惯的要求,需要对输入参数和输出参数进行个数和类型的检查常用的mex库函数有:
mxIsNumeric, mxIsCell等,检查指针所指变量是否为符合某种要求嘚变量类型更多可查阅帮助。
参数检查过程中可使用mexErrMsgTxt输出错误信息

}

我要回帖

更多关于 matlab函数调用 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信