VC与Matlab混合编程——基于编译m函数为DLL的方法

咱也发篇原创,引用的朋友请标注出处。
VC与Matlab混合编程的方法有很多,引擎功能虽强但太慢,而COM又比较麻烦(VB、DELPHI/C++Builder的使用简单些)。今天介绍一种VC与Matlab混合编程的方法。通过将m函数编译成标准的dll动态链接库,实现在VC中对Matlab模块的方便调用。
本文的环境为VC++ 6.0、Matlab 6.5。不同的环境在实现起来可能略有不同。
1 设置Matlab编译器
在Matlab命令窗口中输入mbuild –setup,系统提示“是否对安装的编译器进行配置?”,输入y,显示系统中安装的编译器。选择Microsoft Visual C/C++ version 6.0 in D:/Program Files/Microsoft Visual Studio的编译器,并确定。(注:此步过程只需进行一次。)

2 编写m函数
作为示例,这里编写了一个简单的m函数:
function b = myFunc(a)
b = a.*a;
保存文件名为myFunc.m。

3 编译m函数为DLL
在Matlab命令窗口中输入mcc -B csharedlib:myDLL myFunc.m。其中,myDLL是生成的dll的文件名,这个名子可以更改。
编译完成后,将myFunc.m所在的文件夹下生成9个文件。其中,myDLL.dll、myDLL.lib和myDLL.h三个文件是我们下面所要使用的。

4 建立测试工程
启动VC。选择文件菜单下的新建命令,创建一个Win32 Console Application。在工程类型对话框中选择A simple application。点击完成。

5 设置VC++6.0工作环境
首先设置include文件搜索路径。选择VC的Tools菜单下的Options命令,打开工程设置对话框。点击“目录”选项卡,把D:/MATLAB6p5p1/extern/include路径添加到列表框中。点击确定。
然后添加Lib文件到工程中。选择工程菜单下添加到工程命令,选择Files选项,将D:/MATLAB6p5p1/extern/lib/win32/microsoft/msvc60文件夹下的libmatlbmx.lib文件和上边生成的myDLL.lib文件添加到工程中。
最后,将myDLL.h、myDLL.dll文件拷贝到工程文件夹下。

6 编写测试代码
首先添加#include “myDLL.h”。
myDLL.h输出了几个函数,工程中用到的函数有三个,它们分别是:myDLLInitialize()、myDLLTerminate()和mlfMyfunc()。这三个函数的作用分别是初始化DLL库、结束DLL库和m函数myFunc对应的C函数,这个C函数也是我们所需要的。
和m函数相比,函数名有了一些变化。主要的变化是加上了mlf的前缀。这个前缀应该是MatLab Function的简写。
然后在main()函数内添加代码。总的main()函数代码清单如下所示:
C/C++ code
    
    
int main( int argc, char * argv[]) { myDLLInitialize(); // 库初始化 double _x[ 5 ] = { 1 , 2 , 3 , 4 , 5 }; // 输入数组 double _y[ 5 ]; // 输出数组 mxArray * x = mxCreateDoubleMatrix( 1 , 5 , mxREAL); // 创建1*5矩阵 memcpy(mxGetPr(x), ( void * )_x, sizeof (_x)); // 拷贝输入数据 mxArray * y = mxCreateDoubleMatrix( 1 , 5 , mxREAL); // 创建1*5矩阵 y = mlfMyfunc(x); // 调用m函数 memcpy(_y, mxGetPr(y), sizeof (_y)); // 拷贝输出数据 myDLLTerminate(); // 结束DLL库 printf( " %f/n " , _y[ 0 ]); // 打印结果 printf( " %f/n " , _y[ 1 ]); printf( " %f/n " , _y[ 2 ]); printf( " %f/n " , _y[ 3 ]); printf( " %f/n " , _y[ 4 ]); return 0 ; }

这些代码在理解上应该不是很困难。需要说明的有一点:mxArray可认为是C中与Matlab中相对应的矩阵类型。在C中,变量需要先定义,后使用。另外,在定义mxArray类型的变量后,需要对其进行初始化,指定它的类型和尺寸。mxGetPr()函数用于获取mxArray类型数据的实部首地址,因为内存是连续分配的,所以可以使用内存拷贝函数将一个数组的数据拷贝给它。

7 发布
如果仅是在本机上使用DLL,那么以上六步即可满足要求。如果要在没有安装Matlab的计算机中使用此DLL,还需要随DLL拷贝一些动态链接库等文件。
双击D:/MATLAB6p5p1/extern/lib/win32文件夹下的mglinstaller.exe文件,即可生成所需的文件。
mglinstaller.exe会在D:/MATLAB6p5p1/extern/lib/win32文件夹下生成两个新的文件夹,它们的名称分别是bin和toolbox。发布时只要把这两个文件夹连同DLL一起拷贝就可以了。
所需要文件数目是很大的,但应该可以作很大的精简。因为Matlab输出这些文件,与生成的myDLL.DLL没有什么关系。这个可以作进一步的实验和研究。
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值