matlab r2012a win10,vs2010和Matlab R2012a 混合编程

a4c26d1e5885305701be709a3d33442f.png

a4c26d1e5885305701be709a3d33442f.png

注:Matlab r2010b及以后版本才支持vs2010, 之前版本中mbuild命令输入后可能会找不到vs2010编译器。

2.书写m文件

示例如下:

function [ c ] =

MyAdd( a,b )

%UNTITLED Summary of

this function goes here

%  Detailed explanation goes here

c=a+b;

end

保存为MyAdd.m

3.创建动态链接库

Matlab中输入:mcc -W

cpplib:libMyAdd -T link:lib MyAdd -d [生成文件路径]

其中,mcc是Matlab提供的编译命令,对于这一点,Matlab的帮助说明如下:-W lib:string link:lib其中-W是控制编译之后的封装格式,cpplib,是指编译成C++的lib,cpplib冒号后面是指编译的库的名字,-T表示目标,link:lib表示要连接到一个库文件的目标,目标的名字是后面的MyAdd,即你写的m函数的名字。运行完之后,你的目录下面,将会出现以下一些文件:libMyAdd.cpplibMyAdd.explibMyAdd.dlllibMyAdd.exportslibMyAdd.hlibMyAdd.libmccExcludedFiles.logreadme.txt具体每一个文件的意思,请查帮助,这里只说其中很有用的几个:libMyAdd.dll是编译好的动态库,MyAdd这个函数封装在里面,libMyAdd.h是对应的头文件,在C里面调用这个函数的时候,需要include这个头文件在这个头文件的最后,你可以看到下面的内容:extern LIB_libMyAdd_CPP_API void MW_CALL_CONV MyAdd(int nargout, mwArray& c, const mwArray& a, const mwArray& b);这就是MyAdd的C函数的声明。nargout表示输出变量的个数,a,b,c就是对应了m函数的几个变量。注意,a,b,c三个变量的类型是mwArray,这是Matlab提供的一个特殊的变量类型(在7.0的版本,编译之后,变量类型是mxArray)。mwArray是一个类,具体可以查帮助。

4.系统环境配置

Computer - > Properties -> Advanced system settings -> Environment Variables -> User Variables -> path, 添加(MATLAB下为MATLAB

2012软件安装目录)

...\MATLAB\extern\lib\win32\microsoft;

...\MATLAB\bin\win32

Computer - > Properties -> Advanced system settings -> Environment Variables -> System Variables -> path, 添加

...\MATLAB\runtime\win32;

...\MATLAB\bin;

...\MATLAB\extern\lib\win32\microsoft;

...\MATLAB\bin\win32

5.vs2010环境配置

a.创建一个console application,并新建一个cpp文件(否则之后Property Pages中没有C/C++目录)

b. 设置目录

①Property Pages -> VC++ Directories -> Include Directories, 添加(安装目录下)

...\MATLAB\extern\include\

②Property Pages -> VC++ Directories -> Library Directories, 添加

...\MATLAB\extern\lib\win32\microsoft

③Property Pages -> C/C++ -> General -> Additional Include Directories, 添加

...\MATLAB\extern\include\

④Property Pages -> Linker -> General -> Additional Library Directories, 添加

...\MATLAB\extern\lib\win32\microsoft

⑤Property Pages -> Linker -> Input -> Additional Dependencies, 添加

libeng.lib

libmat.lib

libmex.lib

libmx.lib

mclmcrrt.lib

mclmcr.lib

libMyAdd.lib

6.vs2010下完成程序

把刚才生成的lib*.h lib*.dll lib*.lib文件复制到刚刚新建的工程的文件夹下,并且用添加—现有项添加的工程中。(此处的*代表你的m文件名称)

a4c26d1e5885305701be709a3d33442f.png

其中testmat3.cpp程序如下:

#include

#include

#include

#include "mclmcr.h"

#include "matrix.h"

#include "mclcppclass.h"

#include "libMyAdd.h"

using namespace std;

int main()

{

double a = 6;

double b = 9;

double c;

// initialize lib,这里必须做初始化!

if( !libMyAddInitialize())

{

std::cout <

libMyAdd!" << std::endl;

return -1;

}

// 为变量分配内存空间,可以查帮助mwArray

mwArray mwA(1, 1, mxDOUBLE_CLASS); //

1,1表示矩阵的大小(所有maltab只有一种变量,就是矩阵,为了和Cpp变量接轨,设置成1*1的矩阵,mxDOUBLE_CLASS表示变量的精度)

mwArray mwB(1, 1, mxDOUBLE_CLASS);

mwArray mwC(1, 1, mxDOUBLE_CLASS);

// set data,不用我解释了吧,很简单的,调用类里面的SetData函数给类赋值

mwA.SetData(&a, 1);

mwB.SetData(&b, 1);

// using my add,掉我自己写的函数

MyAdd(1, mwC, mwA, mwB);

// get data,不用我解释了吧,很简单的,调用类里面的Get函数获取取函数返回值

c = mwC.Get(1, 1);

std::cout<

<

// 后面是一些终止调用的程序

// terminate the lib

libMyAddTerminate();

// terminate MCR

mclTerminateApplication();

return 0;

}

7. 程序运行结果:

a4c26d1e5885305701be709a3d33442f.png

出现此结果基本上就说明混合编程成功了。

注:如果m文件中有画图方面的函数,则前边一定要有延时函数,或者在c程序中m函数调用后加上getchar(),否则当lib和MCR被terminated后图像会被关闭----即程序运行后会出现图像“一闪而过”的效果!

8. 参考资料:

(1)<>

by lihui-mn@163.com

(2)<

与c++混合编程>> --------matlab r2011a and

vs2010

以上过程其实还大可简化。如有问题,欢迎交流!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值