• [精] MATLAB 混合编程——上篇:被其它编程语言调用



    Matlab Compiler(编译器)或mcc的使用——个人认为是正道

    1.设置编译器

    http://www.cnblogs.com/fence/archive/2010/10/16/1853276.html

    首先需要配置自己的Matlab Compiler,Matlab Compiler的作用是将程序编译成为机器可以直接执行的程序。配置Compiler的方法是在Matlab命令窗口输入:

    mbuild -setup, 按提示选择matlab自带编译器LCC。

    实验记录:

     

    代码
    >> mbuild -setup
    Please choose your compiler
    for building standalone MATLAB applications:

    Would you like mbuild to locate installed compilers [y]
    /n? y

    Select a compiler:
    [
    1] Lcc-win32 C 2.4.1 in D:\PROGRA~1\MATLAB\R2007a\sys\lcc
    [
    2] Microsoft Visual C++ 6.0 in C:\Program Files\Microsoft Visual Studio

    [
    0] None

    Compiler:
    1

    Please verify your choices:

    Compiler: Lcc
    -win32 C 2.4.1
    Location: D:\PROGRA
    ~1\MATLAB\R2007a\sys\lcc

    Are these correct
    ?([y]/n): y

    Trying to update options file: C:\Documents and Settings\Administrator\Application Data\MathWorks\MATLAB\R2007a\compopts.bat
    From template: D:\PROGRA
    ~1\MATLAB\R2007a\bin\win32\mbuildopts\lcccompp.bat

    Done . . .


    --> "D:\PROGRA~1\MATLAB\R2007a\bin\win32\mwregsvr D:\PROGRA~1\MATLAB\R2007a\bin\win32\mwcomutil.dll"

    DllRegisterServer
    in D:\PROGRA~1\MATLAB\R2007a\bin\win32\mwcomutil.dll succeeded

    --> "D:\PROGRA~1\MATLAB\R2007a\bin\win32\mwregsvr D:\PROGRA~1\MATLAB\R2007a\bin\win32\mwcommgr.dll"

    DllRegisterServer
    in D:\PROGRA~1\MATLAB\R2007a\bin\win32\mwcommgr.dll succeeded

    说明:因为我的机器上原来装有Microsoft Visual C++ 6.0,所以会有两个编译器,会提示你选择一个,这里选择系统自带的,也就是“1”。

    2、编译已经写好的m文件

    说明:mywavelet.m是我写的测试文件,内容如下:

    function mywavelet

    clear all;
    a
    =[100:900];
    b
    =sqrt(a);
    plot(a,b);

    在matlab环境中编译文件,方法是:

    >> mcc -m mywavelet.m

    其中mywavelet为要转成exem文件。执行完毕后,会发现在MATLAB的Current Directory目录下,会出现一些新文件,注意观察^_^。这些文件就是,编译好的文件。这时,可以点一下exe文件,看看是否正常,显示图片否?

    ok后,将它们拷到一个新文件夹下,保管好啦~


    3、寻找所需要的动态链接库

    MCR是由matlab的运行环境,占用不到300M的对于用不同matlab版本生成的exe文件,MCR版本也会有不同,因此,在程序打包时,最好将相应版本的MCR一起打包。

    在已安装Matlab机器上,找MCRInstaller.exe的文件,我的是在这个目录下:
    D:\Program Files\MATLAB\R2007a\toolbox\compiler\deploy\win32\MCRInstaller.exe

    不同的MATLAB版本,可能路径不一样,自己找一下。(7.0以前的版本是mglinstaller.exe)

    找到后,把它也复制到我们保管好的文件夹中,这样我们的文件家中有两类东西,1、MCR安装程序,2、编译好的程序。

    《深入浅出MATLAB7.x混合编程》董为国:

    编译后程序(偏重于动态链接库文件)的发布:

    无论编译成可执行文件,还是动态链接库,要使它们能够发布到别的没有安装MATLAB的计算机上使用,必须在目标计算机上安装MCR。可以利用MATLAB命令buildmcr来创建可以发布给最终用户的MCR安装文件。buildmcr的功能是创建一个包含MCR需要的所有文件的zip压缩文件。buildmcr有如下两种调用方式:

    >> zipfile = buildmcr

    zipfile =
    D:\tools\matlab\toolbox\compiler\deploy\win32\MCRInstaller.zip

    也可以使用输入参数dirname来指定MCRInstaller.zip的保存目录。

    >> zipfile = buildmcr(dirname)

    >> buildmcr('.')

    将把产生的MCRIntaller.zip保存到当前工作目录。


    一般来说,需要发布的文件有3个:

    (1) 编译得到的可执行文件或者库函数

    (2) CTF文件;(3) MCRIntaller.zip

    在最终用户的计算机上,首先需要把MCRIntaller.zip解压,并把MCR中可执行文件在目录加到系统路径上;然后就可以使用编译后的程序了。

    注意:MCR不支持在startup.m中使用addpath命令增加搜索路径。

    startup.m是一个可以让用户设置一些关于MATLAB运行的个性化设置。如果你在运行发布的程序时报错。必须让addpath命令只在非发布情况下才有效。利用isdeployed命令:

    if ~isdeployed
    addpath(...);
    % 其它程序
    end

    另外,编译后发布的程序在运行时需要把CTF解压。所以在运行时,需要确保对CTF文件所在目录有写权力。否则,发布的程序在执行时会报错。如果编译后的程序以光盘的方式发布,那么程序必须先复制到硬盘的某个目录,然后再运行。


    4、将保管好的文件夹移植其他的电脑上

    这个电脑最好没有装MATLAB,以检查在没有MATLAB的环境下,可执行程序是否可以执行。一般是会有问题的,因为还有很多动态链接库没有考过来,程序运行时,会找不到很多东西。

    我们需要做的是,双击安装MCRInstaller.exe,安装目录就选我们当前的目录。确保我们编译好的程序,和安装MCR之后的文件在同一目录下。

    结束,点击可执行文件,应该能出现图片。试试看。


    在MATLAB里运行可执行程序的办法是在前面加一个!,比如:!picshow,后缀名可有可无。
    在其它没有安装matlab的机器上运行exe文件前:
    首先安装matlab的运行环境。在同一机器上可以并存不同版本的matlab环境(换句话说不同版本不兼容)。
    其次是要将“MCRinstaller.exe安装目录\runtime\win32”这个路径添加到该计算机的环境变量中,通常是自动加载。
    如果没有,也可手动安装,添加的方法是:
    右击“我的电脑”“属性”“高级”“环境变量”“添加”指定一个变量名,然后将上述路径复制到里面就可以了。
    注:在安装过程中会弹出让安装Microsoft.NETFramework可以不用安装。
    最后就是将编译生成的相相关文件拷贝到同一目录下,双击即可运行。
    问题:目前此方法可完全运行在没有安装MATLAB以及C/C++的电脑上,但是如果是在AMD的CPU可以运行,但是不会出现任何MATLAB编译的界面。


    美中不足就是,运行的时候dos的那个黑色地窗口一直存在。下面将实现去除黑屏的办法:

    消除运行MATLAB生成的exe程序的dos黑屏的办法
    基于MATLAB生成exe文件后,每次运行都存在dos黑屏的问题,现在可以通过以下方法解决:

    方法一: 在命令窗口输入
    cd(prefdir)
    edit compopts.bat
    在打开的文件最后添加以下语句:


    A.VC环境下:

     set LINKFLAGS=%LINKFLAGS%/SUBSYSTEM:WINDOWS /ENTRY:mainCRTStartup

    B.LCC环境下:
     set LINKFLAGS=%LINKFLAGS% -subsystemwindows

    C. Borland:
     set LINKFLAGS=%LINKFLAGS% -aa


    保存以后,再重新编译m文件,生成的exe文件运行起来就没有dos窗口了

    方法二:使用suppress工具:
    下载附件中的suppress压缩包后解压,(当然您可以自己去Google然后再下载)会看到一个suppress.ini文件,用记事本打开,然后将其中“Name=test.exe”中text.exe的改为你生成的exe文件名。将suppress.exe(有个关盘和显示器的图标),改后的 suppress.ini放到你生成的exe的同目录下。执行suppress.exe或者您自己生成的exe可以了。当然您可以自己修改 suppress.exe的名字,改为您自己想要的名字。

    其中的方法一在使用后生成的exe再到没有任何安装MATLAB的机子上运行也不会有黑屏了。
    方法二的缺点就是要同时存在您生成的exe以及supress.exe,必须在同一目录下。

    基于VS2008和Matlab R2010b版本的混合编程的实现:http://blog.sina.com.cn/s/blog_49cb42490100nm5j.html


    如何为.exe文件传递参数:http://www.matlabsky.com/thread-541-1-1.html

    >> mycmd = ['NewNhello ',num2str(5)];system(mycmd);

    利用mideva编译脱离matlab环境的动态链接库

    http://vision-yan.spaces.live.com/blog/cns!2C7C1EA88CC91A69!253.entry  (Delphi 与Matlab数据接口方案探讨)
    一、基本思路

    如果你看过了以上的几种方案,就会发现它们都必需依赖于MATLAB环境,那么如何能够彻底脱离MATLAB环境呢?这也是我最近一直在研究的,但是天不随人意,虽然找到了相关资料可是却和实际情况相差太远。本来想等全部搞定之后再发这篇文章的,后来转念一想不如让大家共同研究,也许某位达人能参透其中奥妙。此方法是利用一个叫Mideva的软件,是Mathtools公司推出的一种Matlab编译开发软件平台(注:据笔者掌握的最新情况,Mathtools已经被Mathwork收购了),Mediva具有编译转换功能,能够将Matlab函数成编写的Matlab程序转换为c++形式的DLL,然后在Delphi中调用动态库函数,而不必再依赖Malab环境,前提是必须要有两个动态链接库mdv4300和ago4300。

    二、编译步骤

    利用Mideva平台实现Delphi与M文件混合编程步骤如下: 
    1、编写M文件 
    2、在Mideva中执行M文件 
    3、生成动态链接库(DLL) 
    4、Delphi中调用DLL函数

    三、方案总结 
    如果真能实现,那将省去许多不必要的麻烦,可是笔者的问题在于用Mideva编译过后的DLL,Delphi无法识别-_-b,而且根本找不到mdv4300和ago4300两个动态链接库。如果那位仁兄能够成功,望请告知,不胜感激。  

    Visual C++调用Matrix<LIB>——实际是VC与Matrix<LIB>的混合编程

    Matcom是Mideva内核的C++编译器,它可以生成C-MEX和独立的应用程序。Matcom包含了一组称为Matrix<LIB>的C++库,是MathTools公司开发的一个矩阵数学库,提供了一个双精度Matrix类型——Mm,它可以是复数矩阵、实数矩阵、稀疏矩阵甚至n为矩阵。

    在Visual C++工程中直接按照Matrix<LIB>的语法编程,即可以实现高效的编程。

    在Visual C++中安装Matlab Add-in

    Matlab add-in是Matlab 6.0以后版本引入的新工具,它可以方便地生成独立应用程序,也可以将得到的代码嵌入到其它应用程序中。但是,最新的Matlab 7.0以后的版本不再支持Add-in。

    Matlab产生的COM组件的调用 

    matlab com builder

    ActiveX控件

    C/C++调用Matlab计算引擎

    Matlab Engine几乎可以利用Matlab全部功能,但是需要在机器上安装Matlab软件,而且执行效率低,因此这种方式的实用性较低,在商用的应用软件开发中不宜采用。



  • 相关阅读:
    隧道适配器,本地连接过多的解决办法
    C# 遍历HashTable
    sql2005 数据库转为sql 2000数据库的步骤
    自动扫描IP代理地址和自动切换IP的软件
    JS实现网页图片延迟加载[随滚动条渐显]
    批量修改hosts
    C#.NET获取当前月份最大天数
    如何让js调用不影响页面的加载速度?
    在sql中如何替换去掉回车符?
    Linq(01)对Linq的疑问及学习路径
  • 原文地址:https://www.cnblogs.com/xfzhang/p/1912214.html
Copyright © 2020-2023  润新知