广东德尔电器:matlab 2008与VS2008的混合编程
来源:百度文库 编辑:偶看新闻 时间:2024/05/01 17:50:38
从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,错误
这是因为头文件的相对位置不对,把调用matlab的driver头文件放在#include "mclcppclass.h"的前边或者不用#include "mclcppclass.h",因为它就包含在调用matlab的driver头文件中。
// 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; } 编译运行就可以了。