matlab vc 2005,VC2005如何调用MATLAB2009a中编写的m文件

本文是仿照这篇文章而来的:

《VC调用matlab中定义的.m文件中的函数的实例》

他的文章中使用的是VC6.0 + MATLAB6.5,有的东西已经不能使用了,因此我这里再写一篇如何用VC2005来调用MATLAB2009a中编写的m文件。

本例中的m文件源自前面写的一篇文章:

《图像的按列均值分布(matlab)》

本文的输入是矩阵形式的灰度图像(二维矩阵),输出是按列均值分布向量的标准差(double数值),因此,修改后的m文件为:

function y = myfunc1(G)

%求解图像的按列均值分布,并求标准差

%输入为G,是一个8位灰度图像

[m,n]=size(G);

M=mean(G);%按列均值分布向量

i=1:1:n;

y=std(M);

m文件和函数同名。

下一步,在MATLAB中进行编译设置,键入"mex -setup”,选择VC2005:

0818b9ca8b590ca3270a3433284dd417.png

继续输入"mbuild -setup",和上面一样仍然选择VC2005。

下一步,将m文件转换为可被VC调用的dll文件。在matlab中输入命令:

mcc -t -h -L C -W lib:ppp -T link:lib myfunc1.m

MATLAB会提示 -t -h -L 这三个参数已经不再使用了,不管它,工作目录中会生成一堆文件,其中的ppp.h ppp.lib ppp.dll三个文件是我们所需要的。

下一步,在VC2005中添加配合MATLAB编程的lib目录和include目录。

在 " \Tools \ Options \ Projects and Solutions \ VC++ Directories" 中,在 " Include files " 和 " Library files " 中分别添加下列目录(默认安装位置):

" C:\Program Files\MATLAB\R2009a\extern\include "

" C:\Program Files\MATLAB\R2009a\extern\lib\win32\microsoft "

下一步,使用VC2005新建工程,在 " \Project \ Properties \ Configuration Properties \ Linker \ Input " 中添加mclmcrrt.lib。将上述三个文件拷贝到VC工程所在目录,在Project菜单中Add Existing Item把ppp.h和ppp.lib添加到工程中。

下一步,编程。在恰当的位置添加 #include "ppp.h"。在ppp.h中可以看到上面m文件中那个函数的C语言声明:

extern LIB_ppp_C_API bool MW_CALL_CONV mlfMyfunc1(int nargout, mxArray** y, mxArray* G);

其中G和y就是m文件中的输入和输出,因此在C语言中如何调用它就水到渠成了:编译后点击button就能看到计算结果了:147.224319。

01

void CmatlabtestDlg::OnBnClickedButton1()

02 {

03

// TODO: Add your control notification handler code here

04

double mydata[

3][

3] = {

// 测试数据,下面会解释

05       {

255.0,

255.0,

255.0},

06       {

0,

0,

0},

07       {

255.0,

255.0,

255.0}

08    };

09

10    pppInitialize();

// 初始化

11

12    mxArray *G = mxCreateDoubleMatrix(

3,

3, mxREAL);

// 输入矩阵,3×3

13    mxArray *y = mxCreateDoubleMatrix(

1,

1, mxREAL);

// 调用MATLAB函数,参数都必须是矩阵形式

14

15    memcpy((

void *)mxGetPr(G), (

void *)mydata,

sizeof(mydata));

// 拷贝数据

16

17    mlfMyfunc1(

1, &y, G);

// 调用ppp中的函数

18

19

double * md = mxGetPr(y);

// 取得mxArray中的数据

20

double result = md[

0];

// 数组第一个元素就是我们想要的值

21

22    CString str;

23    str.Format(_T(

"%f"),result);

24    MessageBox(str);

25

26    mxDestroyArray(G);

// 释放内存

27    mxDestroyArray(y);

28

29    pppTerminate();

// 结束调用

30 }

我们可以在MATLAB中验证一下,输入下列语句:

a = [255 0 255]

std(a)

得到结果147.2243,可见这个程序是正确的。

关于MATLAB的使用有两个要点:

1.MATLAB是matrix laboratory的简称,一开始就设计为针对矩阵进行操作,因此调用它时的参数都是矩阵形式

2.MATLAB矩阵元素在内存中是按列存储的,上面程序中的测试数据是{{255,255,255},{0,0,0},{255,255,255}},它实际代表这个矩阵

255    0    255

255    0    255

255    0    255

(顺便说一下,在OpenCV中,矩阵在内存中的存储方式是按行存储的,且每行按4字节对齐)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值