zoukankan      html  css  js  c++  java
  • 混合编程的一个实例

    一、

    matlab下m文件

    function [y,z] = myadd2(a, b)

    % dummy function, just to demonstrate the idea

    y = a+b;

    z = a+2*b;

    end

    首先把这个函数编译成C++接口的DLL。为此,我们需要先设置MATLAB编译器。具体做法是在MATLAB命令行执行“mbuild -setup”。然后用下面这行命令把myadd2函数编译成一个C++接口的DLL:

     

    二、

    mcc -W cpplib:libmyadd2 -T link:lib myadd2 -C 

    不加 -C 不会生成 libmyadd2.ctf文件

    结果,我们将会得到包含libmyadd2.dll,libmyadd2.ctf,libmyadd2.h,libmyadd2.lib等在内的一些文件。接下来我们只需要这四个文件。

    三、

    创建一个Win32 Console的VC++工程,把以上四个文件拷贝到VC++工程的源代码所在目录。

    接下来设置VC++,让它能找到MATLAB接口函数的定义及连接库函数。可以有两种设置方式:一种是改VC++6.0中关于VC++的设置,这样的好处是每个新的工程都能自动获得这个设定;而另一种是只改当前工程的设置,也就是设置只对该工程有效。这里用后一种方式。

    进行项目必要的设置(注意这里和VC2005有较大不同,与matlab2010也不同)。vc主界面进入project>Settings,点C/C++选项卡,Category选择Preprocessor,

    Additional  include directories下填入如下路径

    C:Program FilesMATLABR2009aexterninclude

    (dll方式:简单加法)">

    点“link”选项卡,Category选择General,在下面的Object/library modules 那栏的最后添加

    libmyadd2.lib mclmcrrt.lib

    两个库之间以及和其他库以空格隔开。
    然后Category选择input,

    Additional  library path下填写:

    C:Program FilesMATLABR2009aexternlibwin32microsoft

    如图

    (dll方式:简单加法)">
    点击OK。
    至此配置完毕

    在VCcpp文件中

    #include "stdafx.h"后添加

    1. #include <iostream>
    2. #include "libmyadd2.h"

    return 0上面添加

    std::cout << "Hello world!" << std::endl;

             

            if( !mclInitializeApplication(NULL,0) ) 

            { 

                    std::cout << "Could not initialize the application!" << std::endl;

                    return -1; 

            } 

     

            // initialize lib

            if( !libmyadd2Initialize())

            {

                    std::cout << "Could not initialize libmyadd2!" << std::endl;

                    return -1; 

            }

     

            try

            {

            // declare and initialize a

            mwArray a(2, 2,  mxDOUBLE_CLASS);

            double *aData;

            aData = new double[4];

            int i;

            for( i=0; i<4; ++i)

            {

                    aData[i] = 1.0*i;

            }

            // print output

            std::cout << "a = " << std::endl;

            std::cout << aData[0] << ", " << aData[1] << std::endl;

            std::cout << aData[2] << ", " << aData[3] << std::endl;

     

            a.SetData(aData, 4);

     

            // declare and initialize b

            mwArray b(2, 2,  mxDOUBLE_CLASS);

            b(1,1) = 11.;

            b(1,2) = 12.;

            b(2,1) = 21.;

            b(2,2) = 22.;

     

            mwArray y(2, 2,  mxDOUBLE_CLASS);

            mwArray z(2, 2,  mxDOUBLE_CLASS);

     

            // call the function

                    myadd2(2, y, z, a, b);

     

            // copy data from mwArray to C++ objects

     

            // allocate outputs

            double *yData, *zData;

            yData = new double[4];

            if( yData == NULL )

            {

                    std::cout << "Failed to allocate memory for yData!" << std::endl;

                    return -1;

            }

     

            zData = new double[4];

            if( zData == NULL )

            {

                    std::cout << "Failed to allocate memory for zData!" << std::endl;

                    return -1;

            }

     

            // copy data from mwArray to C++

            y.GetData(yData, 4);

            z.GetData(zData, 4);

     

            // print output

            std::cout << "y = " << std::endl;

            std::cout << yData[0] << ", " << yData[1] << std::endl;

            std::cout << yData[2] << ", " << yData[3] << std::endl;

     

            std::cout << "z = " << std::endl;

            std::cout << zData[0] << ", " << zData[1] << std::endl;

            std::cout << zData[2] << ", " << zData[3] << std::endl;

     

            

            // deallocate memory

            delete [] aData;

            delete [] zData;

            delete [] yData;

            }

            catch( const mwException& e)

            {

              std::cerr << e.what() << std::endl;

                      

            }

            // terminate the lib

            libmyadd2Terminate();

     

            // terminate MCR

            mclTerminateApplication();

    点击编译、运行即可。

     

     

    也可将m文件改为:

    function [y,z] = myadd2(a, b)

    % dummy function, just to demonstrate the idea

    y = a+b;

    z = a+2*b;

    x1=0:0.1:10;

    y1=sin(x1);

    plot(x1,y1);

    msgbox('hello world!');

    end

    其他不变,再生成dll文件等加载到VC中,其他不变,看一下效果

    在main()函数中加一句

    system("pause"); //暂停作用

    //////////////////////////////////////////////

    也可将m文件改为:

    function [y,z] = myadd2(a, b,c)

    % dummy function, just to demonstrate the idea

    y = a+b;

    z = a+2*b;

    x1=0:0.1:c;

    y1=sin(x1);

    plot(x1,y1);

    msgbox('hello world!');

    end

    其他不用改,在VC的main()函数中加入:

     mwArray c(1, 1,  mxDOUBLE_CLASS);

    c(1,1)=5;

    将调用函数改为:

            // call the function

                    myadd2(2, y, z, a, b,c);

    可以了

  • 相关阅读:
    halcon 图像控件显示闪烁问题
    halcon中的面向对象,数据保存
    halcon图像合并(贴图到指定位置)
    如何快速创建Html头文件
    海康威视频监控设备Web查看系统(三):Web篇
    海康威视频监控设备Web查看系统(二):服务器篇
    海康威视频监控设备Web查看系统(一):概要篇
    求2个数的最小公倍数和最大公约数
    .NETCore3.0应用程序部署到CentOS7
    [转]Android Studio 1.3.1环境搭建
  • 原文地址:https://www.cnblogs.com/fickleness/p/3152097.html
Copyright © 2011-2022 走看看