matlab封装DLL混合编程总结
最近做了个项目要用到matlab做些算法处理,然后用.net项目调用这个类,我把这个matlab封装dll总结了下如下:
matlab是商业数学软件,优势是在算法开发上面有很强的功能,提供了很多数学算法巩使用者调用比一般编程语言更容易处理复杂算法问题,而且处理算法有并行处理能力,速度上比一边编程语言也快很多.
基于组件对象模型(Component Object Model,COM)的Matlab与其他语言混合编程方法。它以Matlab中的Matlab COM Builder模块为转换工具,将Matlab的M函数文件转换为COM组件后应用在VB程序中。
1.VB与其他语言混合编程的几种方法
(1) 在Mathworks公司推出Matlab 6.5之前,Matlab与VB的混合编程主要有以下5种“1:(1) 中间文件传递法。用VB编写前端用户交互界面,收集必要的参数信息,并保存在一个中间文件(如temp.tx0中,然后利用异步程序调用方式执行Matlab程序;
(2) ActiveX自动化服务技术。将Matlab作为服务器,接收通过引擎传来的数据和指令信息并进行相应的处理,然后将结果经过引擎返回给发送请求的客户机;
(3) 动态数据交换(DDE)。它是进程之间的通信机制,使用Windows消息和共享的内存,使相互作用的应用程序能够动态地交换数据;
(4) 动态连接库(DLL)。应用MathTools公司的Mideva工具软件,借用C++编译器将MATLAB的M函数文件转换为DLL,在VB中加载该DLL;
(5) MatrixVB。它是Mathworks公司相应于Matlab而开发的COM库,在安装MatrixVB后,开发VB程序时可以直接调用600多条Matlab中的基本函数,从而完成Matlab的矩阵运算和图形显示功能。
在上述5种方法中,前3种方法调用过程较复杂,且无法脱离Matlab环境,这直接影响了所开发软件的独立运行和发布。后两种方法虽然能够脱离Matlab环境,但Mideva和MatrixVB软件已停止发行。
为解决与其它应用程序之间的接口问题,Mathworks公司在其2002年推出的Matlab6.5中新增了MatlabCOMBuilder模块,它提供了一个简单易用的图形化用户界面,帮助用户将Matlab的M函数文件自动、快速地转变为独立的进程内COM组件,它以.DLL(ActiveX DLL)形式被装入到客户的进程空间中,可以在任何支持COM组件的应用中使用,例如Visual Ba sic、c#,Microsoft Excel、C/C++语言等。其优点在于VB访问该COM组件时,没有必要进行环境切换,因此可获得最快的运行速度。
2.开发环境配置(Matlab7.11+vs2010+windows7)
(1) 在Matlab中创建COM组件Matlab COM Builder是Matlab Compiler的扩展,安装Mat1ab7.11时至少需要选择Matlab、MatlabCompiler和MatlabCOMBuilder等选项。
(2) 在使用COMBuilder创建COM组件之前还需要对Matlab Compiler进行必要的配置。方法如下:在Matlab命令窗中键入mbuild -setup,将出现选择编译器的提问,所列出的编译器包括计算机中已安装的各种C/C++编译器,例如Matlab自带的C/C++编译器、BorlandC++Builder4、BoflandC++Builder5、Borland C++Builder 6、Microsoft Visual Studio 5.0、MicrosoftVisualStudi06.0、MicrosoftVisualStudio.NET等,用户可根据需要自行选择其中一种并确认即可。如下图运行界面:

(3) 使用matlab7.11自带工具,命令窗口键入deploytool,回车后出现对话框,选择路径,新建一个COM工程,target选择为”Generic COM component”

3. COM组件的创建
安装和配置完成之后,就可在刚生成的工程中创建COM组件
具体过程如下:
<1> 编写M函数文件。在M函数文件中,给出要求Matlab完成的功能,函数文件能够接收参数,也允许返回参数。另外需注意:M函数文件的文件名必须和函数名一致;且COM Builder并不是支持所有的Matlab函数,如某些工具箱函数,具体限制可参阅 Matlab Compiler users Guide;


<2> 单击“add Class”创建类
<3> 单击“AddFile”按钮,添加已经在Matlab环境下编译通过的M函数文件;
<4> 单击“Build”按钮。待编译完成、生成DLL文件,至此,用户编写的M函数文件已转换为COM组件对象。

<5> 将创建成功的COM组件注册到使用它的目标计算机上,且目标计算机要安装MCR。方法如下: 点击package,点击“ADD MCR”把运行环境打包

4.目标计算机以管理员身份安装上面生成的安装包,默认路径安装。安装过程会自动在目标计算机安装matlab运行环境和注册之前生成的DLL。
5.然后VB工程中就可以添加引用,找到和使用之前生成的COM组件。

6.编写程序代码,调用Matlab中的类和函数

PS:遇到的问题:
1.调用类的时候可以编译但运行的时候出现这个错误“检索 COM 类工厂中 CLSID 为 {8E813545-D35B-4F2B-A27A-C0FFA0430223} 的组件失败,原因是出现以下错误: 80040111 ClassFactory 无法供应请求的类 (异常来自 HRESULT:0x80040111 (CLASS_E_CLASSNOTAVAILABLE))。”,解决办法将matlab 的bin目录拷贝到path环境变量里,然后重启下机器就OK了.
2.出现“未能确定Com引用的依赖项,加载类型库出错”的异常,原因为matlab库中“C:\Program Files\MATLAB\MATLAB Compiler Runtime\v714\runtime\win32\MWComUtil”需要注册.
3.用VS调用函数的时候,如果matlab里面函数需要一个参数,调用的时候就要写三个参数,第一个是空值,第二个是返回值,第三个传进去的值.
matlab封装DLL混合编程总结的更多相关文章
- Matlab与.NET混合编程解决人脸识别问题
原文:[原创]Matlab与.NET混合编程解决人脸识别问题 如果这些文章对你有用,有帮助,期待更多开源组件介绍,请不要吝啬手中的鼠标. [原创分享]Matlab.NET混编调用Figure窗体 ht ...
- matlab和c++混合编程---matlab和vs的环境配置问题及方法和步骤(转载)
matlab和c++混合编程---方法和步骤 matlab和c++混合编程---matlab和vs的环境配置问题 摘要:Matlab具有很强的数值计算和分析等能力,而C/C++是目前最为流行的高级程序 ...
- [转] Matlab与C++混合编程,添加OpenCV库
原文地址 峰回璐转 最近在做运动医学软件优化工作,此款软件框架及算法语言全由matlab实现,虽然matlab矩阵运算.数值计算能力强大,但速度让人难以忍 受.软件立刻移植到C++上又不太实际,故采用 ...
- Matlab与C++混合编程,添加OpenCV库
最近在做运动医学软件优化工作,此款软件框架及算法语言全由matlab实现,虽然matlab矩阵运算.数值计算能力强大,但速度让人难以忍受.软件立刻移植到C++上又不太实际,故采用联合编程的方式,速度难 ...
- Matlab与C++混合编程 1--在C++中调用自己写的matlab函数
在Visual Studio中使用C++中调用MATLAB程序 在matlab中可以通过mbuild工具将.m文件编译成dll文件供外部的C++程序调用,这样就可以实现matlab和C++混合编程的目 ...
- 【目录】Matlab和C#混合编程文章目录
本博客所有文章分类的总目录链接:[总目录]本博客博文总目录-实时更新 1.Matlab和C#混合编程文章目录 9.接触Matlab10年后的一个总结,随时使用Matlab要掌握的一些要点 8.国内第一 ...
- 算法库:Matlab与C++混合编程
算法库:Matlab与C++混合编程 最近做光流算法预演过程中,下载的源码中涉及到了Matlab和C++的混合编程.在同事Matlab2014的环境下,程序到是一下就运行通过了.但在我这Matlab2 ...
- Matlab与C++混合编程(依赖OpenCV)
Matlab与C++混合编程实际上就是通过Matlab的Mex工具将C++的代码编译成Matlab支持调用的可执行文件和函数接口.这样一方面可以在Matlab中利用已经编写好的函数,尽管这个函数是用C ...
- matlab与vs混合编程/matlab移植
前言 项目算法中包含了不同编译工具的代码,分别是matlab和VS,需要将二者结合起来,统一在同一个系统工作,此时就要用到matlab和vs混合编程. 在matlab中将.m文件编译生成库文件等供外部 ...
随机推荐
- 一个简单的AJAX实例
创建一个简单的XMLHttpRequest,从一个TXT文件中返回数据. 来源于菜鸟教程 <!DOCTYPE html><html><head><meta c ...
- 百度富文本编辑器UEditor安装配置全过程
网站开发时富文本编辑器是必不可少的,他可以让用户自行编辑内容的样式然后上传到后台!下面我们来介绍如何安装使用百度富文本编辑器 一.下载并且设置百度富文本编辑器的样式 你可以去百度UEditor ...
- SDUT 3340 数据结构实验之二叉树一:树的同构
数据结构实验之二叉树一:树的同构 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 给定两棵树 ...
- ubuntu多网卡绑定
这是最近碰到这个问题,需要将两张网卡绑定,共用一个IP,实现冗余效果.实际上linux双网卡的绑定模式有7中,而在这里常用的是 active-backup linux有七种网卡绑定模式:0. roun ...
- gerrit 调试smtp email
- CSS阻止页面双击选中文本
转载自:w3cui 在双击左右箭头,快速切换图片滚动时,会选择附近区域的文字,感觉不是很好,今天在同事在分享时,讲到了这个问题, 试了一下,不错,解决了问题IE及Chrome下的方法一样,对相应的元素 ...
- 【C#基础】static 关键字用法小结
静态变量 当我们编写一个类时,其实就是在描述其对象的属性和行为,而并没有产生实质上的对象,只有通过new关键字才会产生出对象,这时系统才会分配内存空间给对象,其方法才可以供外部调用. 有时候,我们希望 ...
- WP8__实现ListBox横向滑动及子项绑定图片等控件
<!--实现绑定的图片等信息 ListBox水平滚动--> <Grid> <Grid.Resources> <Style x:Key="horizo ...
- 备份/恢复SQLSERVER数据库,SQL一步实现
--备份SQL SERVER数据库 BACKUP DATABASE book09 TO DISK ='c:\abc.bak' WITH init --恢复SQL SERVER数据库USE MAST ...
- Android IOS WebRTC 音视频开发总结(三二)-- WebRTC项目开发建议
本文主要介绍WEBRTC开发过程中的一些现象,文章来自博客园RTC.Blacker,支持原创,欢迎关注微信公众号blacker,更多详见www.rtc.help 随着移动互联网和智能硬件的快速发展,音 ...