zoukankan      html  css  js  c++  java
  • [精] 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软件,而且执行效率低,因此这种方式的实用性较低,在商用的应用软件开发中不宜采用。



  • 相关阅读:
    [JSOI2007][BZOJ1031] 字符加密Cipher|后缀数组
    leetcode Flatten Binary Tree to Linked List
    leetcode Pascal's Triangle
    leetcode Triangle
    leetcode Valid Palindrome
    leetcode Word Ladder
    leetcode Longest Consecutive Sequence
    leetcode Sum Root to Leaf Numbers
    leetcode Clone Graph
    leetcode Evaluate Reverse Polish Notation
  • 原文地址:https://www.cnblogs.com/xfzhang/p/1912214.html
Copyright © 2011-2022 走看看