double mmessay(double ina, double inb) {
(2)程序所需要加入的静态链接库文件由5.x需要的libmmfile.lib、libmatlb.lib、libmcc.lib、libmx.lib改为libmat.lib、libmatlb.lib、libmex.lib、libmx.lib四个文件
本例中利用matlab函数mxarray *mlfscalar(double v)和函数double *mxgetpr(mxarray *)来实现参数格式转换函数mlfs数据结构课程calar()将double型变量存入一个新建的mxarray结构中,并返回指针,而函数mxgetpr()将 mxarray结构保存的实数的实部取出至于其它参数转换方法可参看参考文献3中的相关部分
libmat.lib,libmatlb.lib,libmex.lib,libmx.lib
b=mlfscalar((double)inb);
a=mlfscalar((double)ina); //利用mlfscalar()进行类型转换
2、翻译本身存在的限制
对于本方法有以下几点区别需要注意:
方法的局限
1、功能的实现受到matlab c函数库的限制
到此,整个翻译过程完成,但是还不能直接调用在这个函数当中运用到了matlab的数学库函数mlf数据结构学习目标sqrt()、mlcplus()和数据转换函数 mlfscalar()、mxgetpr()由于这些函数是固化在链接库当中的,为了连接执行,必须加入几个库文件和几个静态链接库lib文件
mlfassign(&c, mclplus(mlfsqrt(mclvv(a, "a")), mlfsqrt(mclvv(b, "b"))));
(4)6.5版本中直接增加了在vc环境下对m文件的支持在执行mbuild -setup的配置命令后,matlab在vc中提供了matlab project wizard,可在vc环境下直接建立matlab的工程来翻译m文件但是这种翻译方法在遇到未定义函数嵌套时将错误的把函数名翻译为变量名,而mcc 命令将进一步翻译内部嵌套的函数据结构数
return *outc;
最终可以编写这样一个利用了matlab数学函数并实现计算的函数:
3、参数格式转换
double *outc; //计算结果变量
(3)api函数改动很多,虽然数学函数库即mlf前缀的函数少有改动,但是关于变量建立,内存管理和数据类型转换的函数发生改变,即很多原mcc前缀的函数改为用mx为前缀的函数代替,使得很多5.x翻译的c程序代码不能在6.5相应的库下运行通过
mxdestroyarray(a); //释放空间
但是,这种翻译受到matlab参数传递的限制,而不能直接调用,在编译时会出现找不到相应的外部函数的错误解决办法是手动将所有被翻译的函数进行参数传递方式的调整如果m文件当中包含的函数被嵌数据结构体系结构套翻译的层数很深,这样的工作量是巨大而且不可接受的
outc=mxgetpr(c); //c获得结果的实部,即结果
这种翻译的机制是由matlab提供的,mcc命令能直接翻译的函数也仅局限于matlab原有的函数因为这些函数已经被matlab6.5编译好,一般以mlf为前缀,存于动态链接库当中并可被c语言直接调用这些函数在参考文献4中可以查到而超出了这个范围的函数,并在m文件当中被嵌套使用,在用mcc进行翻译的时候,mcc将在函数名前加上前缀mlf,并进一步翻译该函数
mlfassign(&c, mclplus(mlfsqrt(mclvv(a, "a")), mlfsqrt(mclvv(b, "b"))));
同时很多工具箱当中定义的函数据结构讨论范畴数也是不能使用这种方法进行翻译的matlab的工具箱更新速度很快,而相应的matlab c的函数库有一定滞后,导致很多最新的工具箱当中的函数是不能被翻译的
应当指出,matlab所有的计算都是基于一种名为mxarray的数据结构之上的,所有的浮点数、向量或者是矩阵在matlab当中都是通过 mxarray结构来进行存储和传递的当然,matlab所提供的所有数学函数也都是基于这样一种数据结构进行运算的所以,要使用matlab的生成代码,就必须将c语言当中常用的浮点数和整数转换为mxarray结构
mxarray *a,*b,*c; //三个用于matlab数学函数计算的参数
mxdestroyarray(b);数据结构的课程主要学习什么
matlab 5.x和matlab 6.5的区别
(1)程序当中所需的库文件由5.x版本的matrix.h、mcc.h、matlab.h改为mex.h、libmatlb.h、libmatlbm.h等库文件
如果没有以上文件,可以用vc的lib命令将matlab相应的def文件转化为lib文件,转化格式为lib /def:filename.def /machine:ix86 /out:filename.lib
mxdestroyarray(c);
在生成代码当中,mclsetcurrentlocalfunctiontable和mclsetcurrentlocalfunctiontable函数为两个外部函数,将参数传给外部,与数据结构课程介绍其相关的部分都对c程序使用数学函数没有影响最终实际有用并执行运算的只有一句:
因为这种翻译是遵守c语言要求的,因而对于内存分配要求和c语言不同的函数和一些关于图形显示类型的函数(包括大量的gui相关函数)也不能被正确的翻译例如mash.m和step.m这两个较常用的matlab函数,由于上述的限制,就不能用本方法进行翻译
实际上,由matlab翻译的c语句中,大部分的和实际计算有关的语句和自生成的函数都以mlf开头,所以寻找有用语句的简单方法就是直接寻找mlf为前缀的代码
}
对于上述的问题,可以利用在c程序当中运用matlab引擎的方法动态调用matlab的库函数,基本上可以解决上述所有的函数不能被正确数据结构历史发展翻译和图形显示的问题但是,运用matlab引擎的方法需要利用activex的自动化服务器,在运行的时候程序会在后台执行一个matlab的线程而不能完全脱离 matlab的环境,也就意味着在纯c的环境下是不能运用的,必须要先安装matlab并能够在运行时支持多线程工作具体的方法可以参阅参考文献3
使用本文所用的方法可以将m文件翻译为c语言的函数,但是要受到两个因素的制约