VS 调用 Matlab (混合编程)

软件环境: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

其中,mccMatlab提供的编译命令,对于这一点,Matlab的帮助说明如下:
               -W lib:string link:lib其中-W是控制编译之后的封装格式,cpplib,是指编译成C++libcpplib冒号后面是指编译的库的名字,-T表示目标,

       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);             

这就是HelloC函数的声明。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倍左右。


 

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值