汪帮主卫星遥感空间分享 http://blog.sciencenet.cn/u/zjwang 湖北鄂州人,2011年博士毕业于吉林大学。现从事卫星遥感技术工作。

博文

基于DLL形式VC调用MATLAB函数方法

已有 23503 次阅读 2010-5-2 22:39 |个人分类:计算程序|系统分类:科研笔记| MATLAB, 调用, 混合编程

    如果在一MATLAB中或VC中写好了函数的话,想在对方的环境中使用,直接将对方语言的函数编译成DLL是一个很方便的方法,不需要重写了。今天把基于DLL形式VC调用MATLAB函数的主要过程写下,在后续将写一下MATLAB调用VC函数的方法。

1,MATLAB中编译DLL
在MATLAB中写好函数,保存在mtTestFun.m中,使用mcc -W cpplib:mtlibTestFun -T link:lib mtTestFun.m生成DLL,用这个命令生成的是C++形式的,即MATLAB数据类型可以用类;否则用其他的命令生成的C形式的,不能用类。并生成了相应的其他mtlibTestFun.h,mtlibTestFun.lib和mtlibTestFun.dll在内的一些文件
2,VC中引用MATLAB环境
需要引用的.h文件路径为MATLAB安装目录的ExternInclude,需要引用的.lib文件路径为MATLAB安装目录的ExternLibWin32Microsoft;引入附加库mclmcrrt.lib
3,VC中调用MATLAB函数
将刚才MATLAB编译生成的文件全拷到当前VC工程下,只将mtlibTestFun.h文件加入到当前工程,并在需要调用的文件中包含;引入附加库mtlibTestFun.lib。在VC初始化函数里用下面函数进行初始化
mclInitializeApplication(NULL,0);
mtlibTestFunInitialize();
在结束时用下面函数释放
mtlibTestFunTerminate();
mclTerminateApplication();
下面在需要的地方调用,假设是下面的形式
mtlibTestFun(int nargout, mwArray& y, const mwArray& I, const mwArray& th);
nargout是返回参数个数,这里是1,后面y反演向量则是传出参数,I和th则是传入参数辐射值和切高。
C++数据传入MATLAB函数时需要将其转化成mwArray类型
double* pI = new double[row*column];
pl = ...
mwArray mwI(row, column, mxDOUBLE_CLASS);
mwI.SetData(pI, row*column);
返回后还需要将mwArray转回C++类型数据
double* pY = new double[Yrow*Ycolumn];
mwY.GetData(pY, Yrow*Ycolumn);

当然,对于一维数组数据来说,这样调用是没有问题的,但是对于二维矩阵数据来说,上面的调用会发生数据传入和传出错误。因为C++与MATLAB数组存储顺序不一样,MATLAB是列优先与C++中的行优先不同。这个数据的转换也将在后续给出一些解决办法。



https://blog.sciencenet.cn/blog-43777-319006.html

上一篇:HITRAN库数据提取工具ExtractHitPar
下一篇:MATLAB调用C/C++函数的方法
收藏 IP: .*| 热度|

0

发表评论 评论 (5 个评论)

数据加载中...
扫一扫,分享此博文

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-11-26 00:49

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部