• c++调用matlab程序


    Matlab c++混合编程方法

    开发环境:win7 64+vs2010+matlab

    如果想要让matlab调用c++的函数类,则需要把c++编译成mex文件,使用这个方法可以实现混合调试。不过我认为学习c++matlab混合编程一般是通过c++调用matlab函数,因为matlab具有强大的数学函数库,然而vc++具有界面设计灵活的优点,因此这里只介绍通过vc++调用matlab的方法。

    (1)环境配置搭建

    • matlab配置:开始前matlab需要先安装两个编译插件,这个安装直接在matlab命令窗口中敲入分别输入命令:

    >>mex -setup 

    >>mbuild –setup 






    安装过程中要么直接回车,要么选择相关的编译器。

    • vc++项目配置:安装完毕之后,配置c++程序中的包含目录、库目录这个对应于你的电脑matlab的安装位置分别把.h和lib文件指向..externinclude、..externlibwin64microsoft.




    除此之外还要在”链接器-》附加依赖项 “ 中加入调用eigin所需的库libmx.lib、 libmat.lib、libeng.lib,以及调用mwArray所需的类的库mclmcrrt.lib,mwArray是连接c++与matlab所需的 矩阵类,如果不懂这个类的使用需要先网上查看一下用法。同时还要在系统坏境变量中,添加matlab的动态链接库.dll文件所在的位置,这个就在matlab安装位置的bin目录下。

    (2)程序调用

    接着就要开始学习如何通过c++调用matab的函数库了,这个调用方法有两个:

    第一种方法:c++中直接调用matlab的计算引擎eigin。

    在调用的文件中添加eigin头文件:

    #include <engine.h>

    然后在程序想要引用matlab的地方调用eigin函数:

    Engine *ep;
    ep=engOpen(NULL);
    engEvalString(ep,"x=0:0.05:2*pi;y=sin(x);plot(x,y,'.b')");


    我这里是通过c++调用matlab,来绘制一个正玄函数作为例子,在engEvalString函数就是输入命令函数的代码,当然这个函数可以每次在输入的字符串当中只有一条命令,然后多次调用engEvalString函数,你也可以直接把所有的matlab函数代码直接当做一个字符串,输入engEvalString函数中。测试一下调用结果:


    我在例子中通过mfc对话框的open按钮,打开读取图片,并且调用matlab函数的绘制函数,可以看到同时出现了mfc与matlab绘制窗口的共存。我最喜欢用matlab与c++混合编程的原因就是这个,c++逻辑调试比较难,但是如果由matlab显示c++程序运行中一些数据的变化结果进行调试,那就相当爽了。

    这种调用eigin的方法缺点在于要求运行程序的电脑中装有matlab,这个方法我比较不喜欢,因为在公司上班的时候,经常要把自己的demo结果发给其他人测试,而其它人的电脑上没有装matlab,这样就调用不了matlab的eigin

    第二种方法:使用把matlab函数生成为动态链接库,然后在c++中调用该动态链接库:这里测试一下通过c++输入数据给matlab,这些数据是一个图片的其中一个通道数据,然后在matlab中显示该单通道图片,最后把数据返回给c++。采用这种方法就要用到mwArray类实现数据传输了。

    matlab图片数据显示函数

      1. function [ output_args ] = test( input_args )  
      2. [n m]=size(input_args);  
      3. A=uint8(input_args');  
      4. imshow(A);  
      5. output_args=[3,4,5];  
      6. end  
        
    然后在matlab的命令窗口输入如下命令:
    >>mcc -W cpplib:plotsintest -T link:lib test.m
    将生成名字为:plotsintest的动态链接库、静态链接库、头文件,最后再vs中,属性》链接器》附加依赖项》
    plotsintest.lib
    mclmcrrt.lib
    libmx.lib
    libmat.lib
    libeng.lib


    然后在c++中加入头文件plotsintest.h,然后在程序运行的地方调用代码为:
         
    1. if( ! mclInitializeApplication(NULL,0) )  
    2. {          
    3.     fprintf(stderr, "Could not initialize the application. ");  
    4.     exit(1);  
    5. }  
    6.   
    7. if (! plotsintestInitialize() )  
    8. {  
    9.     fprintf(stderr,"Could not initialize the library. ");  
    10.     exit(1);  
    11. }  
    12. int width=m_pOrignImage->GetWidth();  
    13. int heigth=m_pOrignImage->GetHeight();  
    14. double *r=new double[heigth*width];  
    15. for (int i=0;i<heigth*width;i++)  
    16. {  
    17.     r[i]=((BYTE*)lockData.Scan0)[i*4];  
    18. }  
    19. mwArray X(width,heigth,mxDOUBLE_CLASS);//定义输入X;  
    20. mwArray Y;//(width,heigth,mxDOUBLE_CLASS);//定义输入Y;  
    21. X.SetData(r,heigth*width);  
    22. test(1,Y,X);  
    23. plotsintestTerminate();  
    24. mclTerminateApplication();  


    最后显示结果为:

    可以看到,mfc对话框读取显示图片,同时matlab出现了绘制figure窗口。原文地址:http://blog.csdn.net/hjimce/article/details/44904271    作者:hjimce     

  • 相关阅读:
    [NOI2001]炮兵阵地 状压DP
    [GDOI2014]拯救莫莉斯 状压DP
    [ZJOI2010]数字计数 数位DP
    [APIO2007]动物园 状压DP
    [SDOI2013]淘金 数位DP
    环状最大两段子段和
    [清华集训2014]奇数国
    [HNOI2003]激光炸弹
    [SCOI2010]字符串
    [SCOI2005]扫雷
  • 原文地址:https://www.cnblogs.com/zhangdebin/p/5567929.html
Copyright © 2020-2023  润新知