• Visual Studio 与 Matlab实现混合编程


    环境:

    Win10

    vs2010

    Matlab2015

    里面有很多选做的内容,其中2、3必做

    1.Matlab环境设置:

      (选做)我没有做这步,因为打mbuild -setup指令不识别,缺少SDK,但是可以正常调用Matlab,这步是其他方式调用Matlab中的一步,使用Matlab生成DLL文件,VS引用

           要建立独立运行的C应用程序,系统中需要安装Matlab、Matlab编译器、C/C++编译器以及Matlab C/C++数学库函数和图形库函数。
    Matlab编译器使用mbuild命令可以直接将C/C++源代码编译为独立运行程序,在这些源代码中可以使用Matlab提供的接口来调用Matlab数学库函数。
           虽然生成的可执行程序可以脱离Matlab环境运行,但是它需要Matlab C/C++数学库文件或者图形库文件的支持才能运行。但如果C/C++源代码完全是按传统C/C++源代码语法规则编写,没有包含Matlab数学库和图形库的调用,则不仅可以独立与Matlab环境,也不需要那两个库函数的支持。

          在 Matlab 的Command Window 下输入命令。

           mbuild – setup

          操作过程如下图:

        然后输入命令

        mex – setup

        以类似的方法配置编译器。Matlab 的配置完成。

    2.VS环境设置        (必做)

    (1)设置Include 和Library 目录

        项目右键->属性->VC++目录->包含目录:添加

        <MATLAB>R2010bexternincludewin64   我的是:D:RUANJIANMatlabexternincludewin64

        <MATLAB>R2010bexterninclude           我的是:D:RUANJIANMatlabexterninclude

        项目右键->属性->VC++目录->库目录:添加

        <MATLAB>R2010bexternlibwin32microsoft    我的是:D:RUANJIANMatlabexternlibwin64microsoft

        <MATLAB>R2010bexternlibwin64microsoft

    截图:

        :

    (2)设置工程目录:      ( 我并没有设置)  

        项目右键->属性->C/C++->常规->附件包含目录:添加

        <MATLAB>R2010bexternincludewin64

        <MATLAB>R2010bexterninclude

         项目右键->属性->链接器->常规:添加

         <MATLAB>R2010bexternlibwin32microsoft

        <MATLAB>R2010bexternlibwin64microsoft

        项目右键->属性->链接器->输入->附件依赖性:添加  (必做)

        libeng.lib
        libmat.lib
        libmex.lib
        libmx.lib  

        注:1.lib文件包含在<MATLAB>R2010bexternlibwin64microsoft,可根据需要增减

               2.附件依赖性在VS2010前以空格隔开,在VS2010后使用;隔开。

        截图: 

     

    我的截图:

        项目右键->属性->链接器->高级->目标计算机:更改(只针对64位WINDOWS)    (选做)

        MachineX86 -> MachineX64

        注:分析原因为MATLAB根据计算机平台选择了X64编译环境,如此处不修改会出现 错误3   

    (3)配置管理器设置(只针对64位WINDOWS)                                                 (必做)

        生成->配置管理器->平台:更改

        Win32->X64

        注:分析原因为配合链接器中目标计算机的修改,如此处不修改会出现 错误4

        截图:

    3.系统(Windows)环境设置   (必做)

       我的电脑->属性->高级系统设置->高级->环境变量->Path,添加:

         <MATLAB>R2010bin;<MATLAB>R2010bexternlibwin64microsoft;<MATLAB>inwin64

        注:1.Windows7的情况下,“用户变量”和“系统

    变量”都需 添加,如不添加,运行时会出现 错误5

     

        2.哈哈,别忘记重启哈,重启后生效

      

        

       OK!配置就此结束,现在就开始engOpen吧!!对了,别忘记添加#include "engine.h"。

     例程:

    #include <iostream>
    
    #include "windows.h"
    
    #include "math.h"
    
    #include "engine.h"       //Matlab的头文件
    
    int main ()
    
    {
    
        const int N = 50;
    
        double x [ N ], y [ N ];
    
        int j = 1;
    
        for ( int i = 0; i < N ; i ++)
    
        {
    
            x [ i ] = ( i + 1);
    
            y [ i ] = sin ( x [ i ]) + j * log ( x [ i ]);
    
            j *= -1;
    
        }
    
        Engine * pEng = NULL ;
    
        //open engine
    
        if (!( pEng = engOpen ( NULL ))) 
    
        {
    
            std :: cout << "Openmatlab enging failed!" << std :: endl ; 
    
            system ( "pause" );
    
            return -1; 
    
        }
    
        mxArray * xx = mxCreateDoubleMatrix (1, N , mxREAL );
    
        mxArray * yy = mxCreateDoubleMatrix (1, N , mxREAL );
    
        memcpy ( mxGetPr ( xx ), x , N * sizeof ( double ));
    
        memcpy ( mxGetPr ( yy ), y , N * sizeof ( double ));
    
        engPutVariable ( pEng , "xx" , xx );
    
        engPutVariable ( pEng , "yy" , yy ); 
    
        std :: string evalString = "plot(xx,yy);" ;
    
        engEvalString ( pEng , evalString . c_str ());
    
        mxDestroyArray ( xx );
    
        mxDestroyArray ( yy );
    
        Sleep (3*60*100);
    
        //close engine                关闭Matlab 
    
        if ( NULL != pEng )
    
        {
    
            engClose ( pEng );
    
        }
    
        system ( "pause" );
    
        return 1;
    
    }

    效果;

    附录:错误情况及解决

    2.提示:“libeng.lib libmat.lib"无法打开       

    解决:附件依赖性在VS2010前以空格隔开,在VS2010后使用;隔开。

    3.提示:“  "error LNK2019: 无法解析的外部符号 _interp1Initialize,该符号在函..."”

    解决:操作如2.VS环境设置中的(2) 项目右键->属性->链接器->高级->目标计算机:更改...及(3)

    4.提示:“  "模块计算机类型“X86”与目标计算机类型“x64”冲突..."”

    解决:操作如2.VS环境设置中的(3)

    4.提示:“ 系统丢失libeng.dll..."”

    解决:操作如 3.系统环境设置 

    1.mbuild – setup后没有“VS2010”选项
    解决:MATLAB 2010b 之后包含对VS2010编译器的支持,2010a及之前版本不包含支持。如果MATLAB环境较低,Matlab官方有一个补丁(http://www.mathworks.com/support/solutions/en/data/1-D5W493/?solution=1-D5W493)

    源地址:http://blog.renren.com/GetEntry.do?id=721771317&owner=240190126

    源地址:http://www.cnblogs.com/uniquews/archive/2012/12/27/2835923.html

  • 相关阅读:
    Bitmap和Drawable浅谈
    自定义圆边图片控件
    JAVA入门到精通-第62讲-复杂查询
    JAVA入门到精通-第61讲-复杂查询
    JAVA入门到精通-第60讲-sqlServer基本查询
    JAVA入门到精通-第58讲-SQLserver数据类型
    JAVA入门到精通-第59讲-sqlServer基本查询
    JAVA入门到精通-第56讲-查询分析器
    JAVA入门到精通-第57讲-SQLserver数据类型
    JAVA入门到精通-第55讲-sql server基本使用
  • 原文地址:https://www.cnblogs.com/luoqingyu/p/6396250.html
Copyright © 2020-2023  润新知