混合编程的一个实例

一、

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 Files\MATLAB\R2009a\extern\include

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

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

libmyadd2.lib mclmcrrt.lib

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

Additional  library path下填写:

C:\Program Files\MATLAB\R2009a\extern\lib\win32\microsoft

如图

(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] << ",\t" << aData[1] << std::endl;

        std::cout << aData[2] << ",\t" << 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] << ",\t" << yData[1] << std::endl;

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

 

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

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

        std::cout << zData[2] << ",\t" << 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);

可以了

 

posted @ 2013-06-24 11:04  夜雨阑珊  阅读(474)  评论(0编辑  收藏  举报