2.书写m文件
示例如下:
function [ c ] = MyAdd( a,b )
%UNTITLED Summary of this function goes here
%
c=a+b;
end
保存为MyAdd.m
3.创建动态链接库
Matlab中输入:mcc -W cpplib:libMyAdd -T link:lib MyAdd -d [生成文件路径]
其中,mcc是Matlab提供的编译命令,对于这一点,Matlab的帮助说明如下:
-W
运行完之后,你的目录下面,将会出现以下一些文件:
libMyAdd.cpp
libMyAdd.exp
libMyAdd.dll
libMyAdd.exports
libMyAdd.h
libMyAdd.lib
mccExcludedFiles.log
readme.txt
具体每一个文件的意思,请查帮助,这里只说其中很有用的几个:
libMyAdd.dll是编译好的动态库,MyAdd这个函数封装在里面,libMyAdd.h是对应的头文件,在C里面调用这个函数的时候,需要include这个头文件在这个头文件的最后,你可以看到下面的内容:
extern
这就是MyAdd的C函数的声明。nargout表示输出变量的个数,a,b,c就是对应了m函数的几个变量。
注意,a,b,c三个变量的类型是mwArray,这是Matlab提供的一个特殊的变量类型(在7.0的版本,编译之后,变量类型是mxArray)。mwArray是一个类,具体可以查帮助。
4.系统环境配置
Computer
...\MATLAB\extern\lib\win32\microsoft;
...\MATLAB\bin\win32
Computer
...\MATLAB\runtime\win32;
...\MATLAB\bin;
...\MATLAB\extern\lib\win32\microsoft;
...\MATLAB\bin\win32
5.vs2010环境配置
a.创建一个console
b.
①Property
...\MATLAB\extern\include\
②Property
...\MATLAB\extern\lib\win32\microsoft
③Property
...\MATLAB\extern\include\
④Property
...\MATLAB\extern\lib\win32\microsoft
⑤Property
libeng.lib
libmat.lib
libmex.lib
libmx.lib
mclmcrrt.lib
mclmcr.lib
libMyAdd.lib
6.vs2010下完成程序
把刚才生成的lib*.h
其中testmat3.cpp程序如下:
#include <stdio.h>
#include <string.h>
#include <iostream>
#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 <<"Could not initialize 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<<"c is \n" <<c<<std::endl;
// 后面是一些终止调用的程序
// terminate the lib
libMyAddTerminate();
// terminate MCR
mclTerminateApplication();
return 0;
}
7. 程序运行结果:
出现此结果基本上就说明混合编程成功了。
注:如果m文件中有画图方面的函数,则前边一定要有延时函数,或者在c程序中m函数调用后加上getchar(),否则当lib和MCR被terminated后图像会被关闭----即程序运行后会出现图像“一闪而过”的效果!
8. 参考资料:
(1)<<MATLAB2012a和VS2010混合编程的实现(Win7+32bit)>> by
(2)<<Matlab 与c++混合编程>> --------matlab r2011a and vs2010
以上过程其实还大可简化。如有问题,欢迎交流!