Matlab2010与VS2010初吻(一)

来源:互联网 发布:三国志13隐藏武将数据 编辑:程序博客网 时间:2024/04/29 19:26

        (最近因程序中需要数值计算和做图表,研究了matlab与vs混合编程。结合网上的各种版本及个人摸索,找到一种可行且又简单易学的方法,现拿与大家分享)

 

   一、在Matlab中用m文件生成C/C++的DLL

                  打开Matlab
              在command窗口输入mex-setup选择编译器
              在command窗口输入mbuild-setup选择编译器
 
              写一个正确的m函数(如add.m),放在可找到路径中
              在command窗口输入 mcc -B csharedlib: rename Jadd.m(rename 是生成各种C文件的命名,Jadd.m是要编译的m 函数所在m文件)
              或者: mcc -W lib:myadd -T link:lib add.m(用于C的)
                    mcc -W cpplib:myadd -T link:lib add.m(用于C++的)
                    mcc -C -W cpplib:myadd -T link:lib add.m(这个多生成一个.ctf文件,有时要用到,推荐这个)

             (现在耐心等一会,matlab会生成你所需的东西并放到它的默认路径下)


二、创建和配置项

 

(一)、在VS2010里新建一个C++控制台程序
(二)、把用matlb文件生成的dll、lib、h等一并拷到该程序目录里
(三)、(这里以MatlabR2010b为例)把R2010b\\extern\\include和R2010b\\extern\\lib\\win32\\microsoft这这两个夹拷到你的程序目录(不同matlab版本放的位置及命名略有不同,总能找到的)
(四)、在VS2010里的解决方案资源管理器中的项目图标右击》属性》VC++目录
             然后 (1)在包含目录中添加你从matlab拷出来的include夹
                     (2)在库目录中添加你从matlab拷出来的microsoft夹
(五)、这样就差不多了(个人感觉这是最简单的方式),下面开始写代码(注意    J_add是我自己的lib名字哦,要换成你的):
 


三、在代码中调用DLL

 

#pragma once#pragma comment(lib,"J_add.lib")#pragma comment(lib,"mclmcrrt.lib")#pragma comment(lib,"mclmcr.lib")#include<iostream>#include "mclmcrrt.h"#include "J_add.h"int main(){std::cout<<"function y = J_add(A)"<<std::endl;if(!mclInitializeApplication(NULL,0)) //初始化MCR,用完还要关闭,节省资源{std::cout<<"could not initialize the application!"<<std::endl;return -1;}if(!J_addInitialize())//初始化应用,用完还要关闭,节省资源{std::cout<<"could not initialize J_add!"<<std::endl;return -1;}try{mwArray in1(2,2,mxDOUBLE_CLASS);mwArray in2(2,2,mxDOUBLE_CLASS);mwArray out(1,mxDOUBLE_CLASS);//下面将C++矩阵赋给m矩阵:double *in1Data = new double[4];for(int i=0;i<4;i++){in1Data[i] = 1.0*(i+1);}std::cout<<"input1="<<std::endl;std::cout<<in1Data[0]<<" "<<in1Data[1]<<std::endl;std::cout<<in1Data[2]<<" "<<in1Data[3]<<std::endl;in1.SetData(in1Data,4);////m矩阵直接赋值法:in2(1,1) = 1;in2(1,2) = 2;in2(2,1) = 3;in2(2,2) = 4;//将m矩阵赋给C++矩阵:double *in2Data = new double[4];in2.GetData(in2Data,4);std::cout<<"input2:"<<std::endl;std::cout<<in2Data[0]<<" "<<in2Data[1]<<std::endl;std::cout<<in2Data[2]<<" "<<in2Data[3]<<std::endl;                                                                                                                                                                                                                                                                                                //调用DLL函数J_add(该函数名字通原m文件中命名相同)add(1,out,in1);//std::cout<<"size of output:"<<out.operator size_t()<<std::endl;std::cout<<"value of output:"<<out.ToString()<<std::endl;delete []in1Data;delete []in2Data;}catch(const mwException&e){std::cerr<<e.what()<<std::endl;}J_addTerminate();//结束lib引用mclTerminateApplication();//结束MCRreturn 0;}


 
附:上面例子中的m文件add.m原文如下:

    

function sum = add(A)%用于C/C++的通用的求和函数sum = sum(sum(A));end


 

 

 

 

 

原创粉丝点击