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文件编译生成库文件等供外部 ...
随机推荐
- jQuery与Ajax
Ajax简介 : Asynchronous Javascript And XML (异步的JavaScript和XML) AJAX 不是新的编程语言,而是一种使用现有标准创建快速动态网页的技术. 通过 ...
- 下载和使用 Open XML PowerTools
安装 Open XML SDK 2.5 首先,需要安装 Open XML SDK 2.5 ,从这个地址下载安装程序:http://www.microsoft.com/en-in/download/de ...
- 修改 sql server 2008R2的端口,配置防火墙允许远程访问SQL Server 2008 R2
1.先修改 sql server 2008R2的端口号吧,1433经常成为别人入侵的端口,在sql server 配置管理器 -->sql server 网络配置-->MSSQLSERVE ...
- 请慢慢移动……由于操作快慢导致的bug
最近的工作中,遇到一个由于操作快慢不同导致的bug,原因是,操作慢的时候程序接收到了停止操作,继续处理正确,而快速操作的时候程序来不及处理操作停止的动作,导致需要传入的数据值已经改变,程序报错.这种缺 ...
- university, school, college, department, institute的区别
这些个词没有太大区别,有时候有些词是可以通用的,而有些用法则是随着地域时间的不同而变迁. 一般说来,college译作“学院”,它是university (综合性大学)的一个组成部分,例如,一所综合大 ...
- Kafka Quick Start
1.Download > tar -xzf kafka_2.11-0.10.0.0.tgz> cd kafka_2.11-0.10.0.0 2.启动zookeeper服务 Kafka使用的 ...
- Add, remove, shuffle and sort
To deal cards, we would like a method that removes a card from the deck and returns it. The list met ...
- uitextview 最后一行遮挡
这只 uiscrollerview 的 setContentOffset CGRect line = [textView caretRectForPosition: textView.selected ...
- java servlet上传文件并把文件内容显示在网页中
servlet3.0(JDK1.6)自带的API即可实现本地文件的上传,Servlet3.0新增了Part接口,HttpServletRequest的getPart()方法取得Part实现对象.下面我 ...
- QQ聊天信息提取
先前在iOS 8.x版时,往往未能顺利取出QQ的聊天信息,即使顺利取出数据库,却发现聊天信息已被加密处理,仅只能得知是与哪些QQ号进行聊天,而未能顺利得知聊天内容. 但这个情况到后来有了变化,以下情境 ...