广东德尔电器:matlab 2008与VS2008的混合编程

来源:百度文库 编辑:偶看新闻 时间:2024/05/01 17:50:38
matlab 2008与VS2008的混合编程

从Matlab 2008开始才能支持VS2008,所以这里写一个例子介绍如何将二者结合,生成 .dll文件进行混合编程。

   首先,为matlab安装mex和mbuild并配置好环境变量。

   下面给出一个具体实例进行讲解:

    在matlab中写一个简单inverse.m实现求矩阵逆:

function y=inverse(a,NUM)

%NUM 是a维数,这里没有什么实际意义

y=inv(a);

针对上面例子创建状态链接库(在matlab中使用mcc命令):

mcc -C -W cpplib:libinverse -T link:lib inverse.m

注意1:这里加了一个-C,这是因为在matlab2008中使用mcc -W cpplib:libinverse -T link:lib inverse.m.时候,只会生成.lib .h .dll文件(注意,这四个文件默认生成位置是:桌面。。\My Documents\MATLAB文件夹中),但并不会生成.ctf文件,那是因为matlab2008默认地把ctf文件放到别文件中了,所以没有单独生成(你可以用mcc ?查一下),如果想要单独生成ctf文件,可以在里面加上-C这个选项,如上所示。

接下来,在VS2008中建立一个C++工程Test_matlab,使其调用这个.dll。把上面mcc命令生成.lib .h .dll .ctf文件放到Test_matlab工程中,然后在VS中配置工程,需要配置以下几项:

打开project->Test_matlab_properties->C/C++->general->Addational Include Directories, 把MATLAB提供include路径加到VC++头文件搜索路 径加入。

打开project->Test_matlab_properties->Linker->general->Addational Library Directories, 把相应lib所在目录加入。

打开project->Test_matlab_properties->Linker->Input->Addational Dependencies 把.lib 与mclmcrrt.lib加入,中间用空格。

    最后,把.h添加到VC++程序中,其主程序如下(请转II):

   注意2有可能出现'mclInitializeApplication_proxy': identifier not found,错误

   这是因为头文件相对位置不对,把调用matlabdriver头文件放在#include "mclcppclass.h"前边或者不用#include "mclcppclass.h",因为它就包含在调用matlabdriver头文件中。


// Test_matlab.cpp : Defines the entry point for the console application.

//程序中包括我做一些其它测试,例如内存写顺序,如何传递参数等等问题

//程序功能:VC++调用matlab中inv函数,实现NUM*NUM矩阵求逆

#include "libinverse.h" // DLL 头文件

#include "iostream"

//#include "mclmcr.h" // mxArray 类型声明

using namespace std;

int main()

{

// 初始化程序

       int i,j;

       if( ! mclInitializeApplication(NULL,0) )

       {

              fprintf(stderr, "Could not initialize the application.\n");

             exit(1);

       }

// 初始化库

       if (! libinverseInitialize() )

       {

              fprintf(stderr,"Could not initialize the library.\n");

              exit(1);

       }

       printf("game over!\n");

      int NUM=10;

       double **xx=new double*[NUM];

       xx[0]=new double[NUM*NUM];

       for(i=0;i

       {

            xx[i]=xx[0]+i*NUM;

       }

       double *x=new double[NUM*NUM];

       for(i=0;i

              for(j=0;j

              {

                     if(i==j)

                            xx[i][j]=2;

                     else

                            xx[i][j]=0;

              }

       for( i=0;i

              for( j=0;j

              {

                     x[i*NUM+j]=xx[j][i];                 //matlab一列一列地写

              }

     mwArray a(NUM,NUM,mxDOUBLE_CLASS);//a用于存储待计算矩阵,在matlab语言中从a(1,1)开始计数

       for(int i=1;i<=NUM;i++)

              for(int j=1;j<=NUM;j++)

                     a(i,j) = xx[i-1][j-1];

       mwArray y(NUM,NUM,mxDOUBLE_CLASS);//y用于输出最后得到矩阵

       mwArray n(1,1,mxINT32_CLASS);     //n是一个一维矩阵,存储NUM值

       n(1,1) = NUM;

       inverse(1,y,a,n);

       for(int i=0;i

       {

              for(int j=0;j

              {

                     cout<

              }

              cout<

       }

    libinverseTerminate();                                //关闭库和程序

    mclTerminateApplication();

       delete[] x;

       delete[] xx[0];

       delete[] xx;

}

编译运行就可以了。