chckxy函数 matlab,在VS2010中调用MATLAB内建函数

整个过程如下:

1. 首先在R盘根目录下创建"DLL"文件夹,然后把spline.m和chckxy.m两个文件拷贝到"R:\DLL"文件夹下(在我的机器上,spline.m位于文件夹"C:\Program Files\MATLAB\R2012b\toolbox\matlab\polyfun\"下,chckxy.m位于文件夹"C:\Program Files\MATLAB\R2012b\toolbox\matlab\polyfun\private\"下)。

2. 在MATLAB中打开"R:\DLL\spline.m",修改第54行代码,把"chckxy"改为"mycheck",如图:

0818b9ca8b590ca3270a3433284dd417.png

3. 把"R:\chckxy.m"重命名为mycheck.m,如图:

0818b9ca8b590ca3270a3433284dd417.png

4. 在MATLAB中打开"R:\DLL\mycheck.m",修改第1行代码,把函数名由"chckxy"改为"mycheck",如图:

0818b9ca8b590ca3270a3433284dd417.png

5. 在MATLAB命令窗口下输入mcc指令编译spline.m,即:

1

>> cd R:\DLL

2

>> mcc -W cpplib:libspline -T link:lib spline.m

完成后,在"R:\DLL"下会生成如下的文件,依然,其中的"libspline.dll"、"libspline.h"和"libspline.lib"这三个文件是我们所需的。

0818b9ca8b590ca3270a3433284dd417.png

6. 接下来,打开VS2010,单击"文件"菜单--"新建"--"项目":

0818b9ca8b590ca3270a3433284dd417.png

选择"Visual C++"--"Win32 控制台应用程序",项目名称"SplineTest",位置在R盘根目录,点击"完成"。

0818b9ca8b590ca3270a3433284dd417.png

7. 把"R:\DLL"文件夹下的"libspline.dll"、"libspline.h"和"libspline.lib"三个文件拷贝到新建的SplineTest项目路径下(即"R:\SplineTest\SplineTest\"下),如图:

0818b9ca8b590ca3270a3433284dd417.png

8. 在"SplineTest"项目中添加libspline.h头文件。如图,在"解决方案资源管理器"中,右键单击"头文件"--"添加"--"现有项",把第7步中拷贝到"R:\SplineTest\SplineTest\"下的头文件"libspline.h"添加到"SplineTest"项目中去。

0818b9ca8b590ca3270a3433284dd417.png

9. 开始配置SplineTest项目属性。在"解决方案资源管理器"中,右键点击"SplineTest"--"属性",打开属性页:

0818b9ca8b590ca3270a3433284dd417.png

在"SplineTest属性页",左边选中"配置属性"--"VC++ 目录",右边点击"包含目录"后的下拉框,点击"编辑",如图:

0818b9ca8b590ca3270a3433284dd417.png

在弹出的"包含目录"对话框中,点击右上方的"新行"按钮,在列表框中输入MATLAB的include文件夹位置后,点击"确定"按钮(在我机器上,路径为"C:\Program Files\MATLAB\R2012b\extern\include"),如图:

0818b9ca8b590ca3270a3433284dd417.png

回到"SplineTest属性页",右边点击"库目录"后的下拉框,点击"编辑",弹出"库目录"对话框,同样点击"新行"按钮,在列表框中输入MATLAB的lib文件夹位置后确定(由于我的机器是64位系统,路径为"C:\Program Files\MATLAB\R2012b\extern\lib\win64\microsoft";如果您是32位系统,路径应该与"win32"相关)如图:

0818b9ca8b590ca3270a3433284dd417.png

再次回到"SplineTest属性页",左边选中"配置属性"--"链接器"--"输入",右边点击"附加依赖项"后的下拉框,点击"编辑",如图:

0818b9ca8b590ca3270a3433284dd417.png

在弹出的"附加依赖项"对话框中,输入所需的两个lib文件:"mclmcrrt.lib"和"libspline.lib","确定"。

0818b9ca8b590ca3270a3433284dd417.png

10. 最后,由于我是64位系统,需要配置成64位的方案平台(对于32位的系统,此步可跳过)。以"Debug"版本为例,点击工具栏中"Win32"后的下拉列表,选择"配置管理器",如图:

0818b9ca8b590ca3270a3433284dd417.png

在弹出的"配置管理器"对话框中,点击"活动方案解决平台"的下拉列表框,选择"新建":

0818b9ca8b590ca3270a3433284dd417.png

接着,在弹出的"新建解决方案平台"对话框中,一般会自动出现"x64","从此处复制设置"为"Win32",并自动勾选"创建新的项目平台",点击"确定"按钮。这就意味着之前我们对包含目录、库目录以及链接器的设置已被复制到64位平台中。

0818b9ca8b590ca3270a3433284dd417.png

回到"配置管理器"对话框,可以看到"活动方案解决平台"已为"x64",点击"关闭"按钮。

0818b9ca8b590ca3270a3433284dd417.png

至此,对"SplineTest"项目配置完毕。

11. 接下来,就是在VS2010中编写C++代码调用spline函数了。参考在VC++6.0中调用MATLAB生成的DLL中的四. 编写代码调用DLL,我们编写类似的代码。可以看到,在加入"SplineTest"项目中的"libspline.h"的第109行,包含有spline函数的声明:

1

extern LIB_libspline_CPP_APIvoid MW_CALL_CONV spline(int nargout, mwArray& output,const mwArray& x,const mwArray& y,const mwArray& xx);

该声明表示spline的调用接受5个参数:

第1个参数nargout表示返回值的个数,由于只有一个返回值,所以nargout为1;

第2个参数output表示返回值;

第3个参数x和第4个参数y表示的是样点数据;

第5个参数xx表示插值的数据点。

为了验证所编写的C++程序对spline函数的调用结果,与MATLAB中的调用结果是否一致,我使用了MATLAB帮助文件中的spline调用示例:

1

x = 0:10;

2

y = sin(x);

3

xx = 0:.25:10;

4

yy = spline(x,y,xx)

5

plot(x,y,'o',xx,yy);

上述代码的plot图看起来是这样:

0818b9ca8b590ca3270a3433284dd417.png

打开"SplineTest"项目中的"SplineTest.cpp",模仿上述MATLAB代码编写C++代码如下:

1

// SplineTest.cpp : 定义控制台应用程序的入口点。

2

3

#include "stdafx.h"

4

#include "libspline.h"  //增加头文件

5

#include

6

#include

7

#include

8

using namespace std;

9

10

int _tmain(int argc, _TCHAR* argv[])

11

{

12

//初始化lib(必须)

13

if (!libsplineInitialize())

14

return -1;

15

16

int i, j;

17

double x[1][11], y[1][11];

18

for(i=0; i<11; i++)

19

{

20

x[0][i] = i;

21

y[0][i] =sin(x[0][i]);

22

}

23

24

double xx[1][41];

25

for(i=0; i<41; i++)

26

xx[0][i] = i*0.25;

27

28

double yy[1][41];

29

30

mwArray mwX(1,11,mxDOUBLE_CLASS);

31

mwArray mwY(1,11,mxDOUBLE_CLASS);

32

mwArray mwXX(1,41,mxDOUBLE_CLASS);

33

mwArray mwYY(1,41,mxDOUBLE_CLASS);

34

mwX.SetData(*x, 11);

35

mwY.SetData(*y, 11);

36

mwXX.SetData(*xx, 41);

37

mwYY.SetData(*yy, 41);

38

39

spline(1, mwYY, mwX, mwY, mwXX);//调用spline

40

41

cout<

42

i = 0;

43

for(j = 0; j < 41; j++)

44

{

45

//Get第一个参数表示用1个下标访问元素,j+1是列号(MATLAB下标从1开始,而C++从0开始,故做+1操作)

46

yy[0][j] = mwYY.Get(1,j+1);

47

cout<

48

i++;

49

if(i%7 == 0) cout<

50

}

51

cout<

52

53

//终止调用

54

libsplineTerminate();

55

56

return 0;

57

}

运行上述代码,得到结果如下:

0818b9ca8b590ca3270a3433284dd417.png

而对于spline函数,在MATLAB中的调用结果是:

1

yy =

2

Columns 1 through 7

3

0    0.2692    0.5017    0.6938    0.8415    0.9408    0.9878

4

Columns 8 through 14

5

0.9786    0.9093    0.7789    0.5982    0.3810    0.1411   -0.1075

6

Columns 15 through 21

7

-0.3501   -0.5715   -0.7568   -0.8928   -0.9742   -0.9974   -0.9589

8

Columns 22 through 28

9

-0.8578   -0.7032   -0.5065   -0.2794   -0.0342    0.2142    0.4498

10

Columns 29 through 35

11

0.6570    0.8215    0.9357    0.9937    0.9894    0.9196    0.7927

12

Columns 36 through 41

13

0.6198    0.4121    0.1807   -0.0632   -0.3085   -0.5440

结果没有问题,但慢是一如既往地慢。问题解决,完毕。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值