潜水时间太长了,咱也发篇原创。VC与Matlab混合编程——基于编译m函数为DLL的方法

BORLANDSUN 2009-02-19 11:53:14
加精
咱也发篇原创,引用的朋友请标注出处。
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()函数代码清单如下所示:

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没有什么关系。这个可以作进一步的实验和研究。
...全文
4197 95 打赏 收藏 转发到动态 举报
写回复
用AI写文章
95 条回复
切换为时间正序
请发表友善的回复…
发表回复
chenzhao064 2012-06-12
  • 打赏
  • 举报
回复
支持牛人!
houliang120 2011-12-05
  • 打赏
  • 举报
回复
期待更多像楼主这样的牛人发的牛贴。。。。。。。。
luke_emily 2011-11-06
  • 打赏
  • 举报
回复
貌似 我的matlab新版本不太适用这个方法呢 楼主能否详细解释一下呢?
miro117 2011-10-24
  • 打赏
  • 举报
回复
东西不错,我去试试先
nirvana1203 2011-08-08
  • 打赏
  • 举报
回复
lz 我用你的方法试了一下,vc的运行结果是错误,无法定位程序输入点mclTimes于动态连接库libmatlb.dll上,是个怎么回事呢,你能不能给我说一下。谢谢
w20011025 2011-06-22
  • 打赏
  • 举报
回复
[Quote=引用 85 楼 aa_qq110 的回复:]
好久不看Matlab 写得不错赶紧藏起来
[/Quote]。。。。。。
EYPHKA 2010-12-14
  • 打赏
  • 举报
回复

y = mlfMyfunc(x); 这个地方出错啊

查看函数定义是有三个参数的

我刚开始接触matlab 看混合编程也比较匆忙

想试一试简单的程序看我的配置有没有问题

请教楼主上面的这个问题如何解决 ? 谢谢
lee7282007 2010-12-05
  • 打赏
  • 举报
回复
请问楼主,这种方法适合于matlab7.0以上版本吗?
秦剑 2010-12-01
  • 打赏
  • 举报
回复
好久不看Matlab 写得不错赶紧藏起来
imagine186 2010-11-27
  • 打赏
  • 举报
回复
学习了
donghuashaojiang 2010-11-27
  • 打赏
  • 举报
回复
今天来收藏啦
lllyyyttt 2010-10-10
  • 打赏
  • 举报
回复
谢谢,有用
benbenRH 2010-09-23
  • 打赏
  • 举报
回复
原创?好像见过一个图文的。
gaohan771 2010-09-08
  • 打赏
  • 举报
回复
对我很有用的,呵呵,谢谢了,顶一下!
mylmjymym 2010-08-22
  • 打赏
  • 举报
回复
出现错误:无法定位输入点mxGetRegisterInternalFcnsFcn于动态链接库libmx.dll上。
lidian09 2010-08-19
  • 打赏
  • 举报
回复
楼主,高版本的怎么就实现不了啊,error C3861: “mlfMyfunc”: 找不到标识符。哪位可以告诉我怎么解决吗?
ScalleteLeng 2010-08-02
  • 打赏
  • 举报
回复
有没有画图的啊
guoweibob1987 2010-03-29
  • 打赏
  • 举报
回复
非常受用~谢谢楼主了。这里还有个问题就是用mxArray* x = mxCreateDoubleMatrix(1, 5, mxREAL)创建初始化矩阵时,矩阵能否是动态的,不需要把x的大小直接定死呢?
volkswageos 2010-03-28
  • 打赏
  • 举报
回复
[Quote=引用楼主 borlandsun 的回复:]
咱也发篇原创,引用的朋友请标注出处。
VC与Matlab混合编程的方法有很多,引擎功能虽强但太慢,而COM又比较麻烦(VB、DELPHI/C++Builder的使用简单些)。今天介绍一种VC与Matlab混合编程的方法。通过将m函数编译成标准的dll动态链接库,实现在VC中对Matlab模块的方便调用。
本文的环境为VC++ 6.0、Matlab 6.5。不同的环境在实现起来可能略有不同。
……
[/Quote]

这个制作dll文件的方法比较好,不用依赖MATLAB软件在vc运行的时候
chenzhuo8804 2010-02-27
  • 打赏
  • 举报
回复
神贴!!! 支持楼主
加载更多回复(73)

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧