软件环境:win10 64bit + Matlab2015b + vs2010
Matlab新建Hello.m文件
function [ yt ] = Hello( x,y,m,xrange,t )
%xy为坐标向量,m为多项式阶数,xrange为显示图上面的坐标范围,t为要求的坐标横轴位置
% Detailed explanation goes here
p=polyfit(x,y,m);%计算各阶系数p1x^m+p2x^(m-1)+....+ pmx+ p(m+1)
yy=polyval(p,xrange);%计算一个区域内的函数值用于画图
yt=polyval(p,t); % 计算指定x下的函数对应的y值
plot(x,y,'r*',xrange,yy,'b');
saveas(1,'myfig.jpg');
end
其中,mcc是Matlab提供的编译命令,对于这一点,Matlab的帮助说明如下:
-W
link:lib表示要连接到一个库文件的目标,目标的名字是后面的Hello,即你写的m函数的名字。
运行完之后,你的目录下面,将会出现以下一些文件:
Hello.cpp
Hello.exp
Hello.dll
Hello.exports
Hello.h
Hello.lib
mccExcludedFiles.log
readme.txt
在Matlab命令行输入:
1.mex -setup , 选择VS2010,默认使用C编译器就可以。
2. mbuild -setup 选择VS2010,默认使用C编译器就可以。
3.mcc -W cpplib:Hello -T link:lib Hello
这里比较容易出现问题,很多人遇到输入命令!mcc出现编译器没有license的情况,我用Matlab2014a也出现
同样的问题,进多方破解无效后果断换Matlab2015b,然后就成功了。
extern LIB_Hello_CPP_API void MW_CALL_CONV Hello(int nargout, mwArray& yt, const mwArray& x,
const mwArray& y, const mwArray& m, const mwArray& xrange, const mwArray& t);
这就是Hello的C函数的声明。nargout表示输出变量的个数,其他就是对应了m函数的几个变量。
注意,变量的类型是mwArray,这是Matlab提供的一个特殊的变量类型(在7.0的版本,编译之后,变量类型是mxArray)。
mwArray是一个类,具体可以查帮助。
VS使用的是64位配置。
4.在系统变量添加动态链接库DLL文件路径
4.1......\Matlab2015b\bin\win64;
4.2......\Hello.dll所在的文件夹
5. 接着在VS的project属性中添加include文件路径
5.1...\MATLAB\extern\include\
5.2...\Hello.h文件路径
6.Project中添加静态链接库Lib文件的路径
6.1 ...\Matlab2015b\extern\lib\win64\microsoft
6.2 ...\Hello.lib文件路径
7. 添加使用的lib名称
libeng.lib
libmat.lib
libmex.lib
libmx.lib
mclmcrrt.lib
mclmcr.lib
Hello.lib
8.接着编写VSproject调用Matlab函数的代码。
#include "mclmcr.h"
#include "matrix.h"
#include "mclcppclass.h"
#include "Hello.h"
void main()
{
if( !HelloInitialize())
{
printf("初始化失败");
}
// 为变量分配内存空间,可以查帮助mwArray
mwArray mwX(5, 1, mxDOUBLE_CLASS); // 5,1表示矩阵的大小(所有maltab只有一种变量,就是矩阵,
mwArray mwY(5, 1, mxDOUBLE_CLASS);//为了和Cpp变量接轨,设置成1*5的矩阵,mxDOUBLE_CLASS表示变量的精度)
mwArray mwM(1, 1, mxDOUBLE_CLASS);
mwArray mwXR(50,1, mxDOUBLE_CLASS);
mwArray mwYT(1,1, mxDOUBLE_CLASS);
mwArray mwT(1,1, mxDOUBLE_CLASS);
int x[5]={432,435,438,441,443}; //样本点坐标
int y[5]={136,138,140,145,147}; //
int xr[50],m=3,t=446; //参数设置
for (int i=400;i<450;i++)
{
xr[i-400]=i;
}
mwX.SetData(x, 5); //调用类里面的SetData函数给类赋值
mwY.SetData(y, 5);
mwM.SetData(&m, 1);
mwXR.SetData(xr, 50);
mwT.SetData(&t, 1);
Hello(1,mwYT,mwX,mwY,mwM,mwXR,mwT);
double c = mwYT.Get(1, 1); //调用类里面的Get函数获取取函数返回值
/*CString strNumber;
strNumber.Format(_T("%lf"),c);
MessageBox(strNumber, _T("坐标"));*/
// 后面是一些终止调用的程序
HelloTerminate();
// terminate MCR
mclTerminateApplication();
}
编译vs project,运行!
Matlab中的plot函数画图之后就一闪就退出了,目前在matlab函数中添加了保存图片的功能,这样就可以看到画出来的图像了。
Matlab中开启窗口画图、保存图像等操作是非常耗时的,如果没有画图,函数运行速度可以提高10倍左右。