VS 调用 Matlab


VS2010 调用 MatlabR2011a


1、VS2010建立win32 console application,选择Empty project,添加C源文件。

2、右键项目:

在属性-> VC++目录->包含目录下加上:

…\Program Files\MATLAB\R2011a\extern\include

在属性-> VC++目录->库目录下加上:

…\Program Files\MATLAB\R2011a\extern\lib\win32\microsoft


3、引用库文件,
在代码中添加:

#pragma comment(lib,"libeng.lib")

#pragma comment(lib,"libmx.lib")

也可以在Project->Properties...选择Configuration Properties下的Linker->Input,在Additional Dependencies栏目中输入项目需要引用matlab的的lib文件库。

例如:libeng.lib;libmx.lib;libmex.lib等。不过我倾向于前者,这样在发布源码的同时, 就尽最大可能地保证能够编译,而不用其他人学习的时候再去设置。


4、加载matlab引擎 :

在代码中添加 #include "engine.h"


5、如果编译通过,但提示运行缺少dll的问题,需要在我的电脑->属性->高级->环境变量->系统变量下的path中加入
…\Program Files \MATLAB\R2011a\bin\win32的路径,然后重新启动VS,打开工程运行即可。


6、附录代码

View Code
#include <stdio.h>
#include <string.h>
#include "engine.h"

#define BUFSIZE 256

#pragma comment(lib,"libeng.lib")
#pragma comment(lib,"libmx.lib")

int main()
{
Engine *ep;
mxArray *mxN;
mxArray *mxData;
mxArray *Y;
mxArray *X;
double temp[3] = {1.0, 2.0, 3.0};
int i, j;
int dims[10];
int ndims;
double *p;
char buffer[BUFSIZE+1];

/* 打开matlab引擎 */
if (!(ep = engOpen(NULL))) {
exit(-1);
}

/* 设置窗口不可见 */
engSetVisible(ep, false);

/* 获取matlab输出 */
buffer[BUFSIZE] = '\0';
engOutputBuffer(ep, buffer, BUFSIZE);

/* 执行matlab语句 运行用户自己编写的函数 */
engEvalString(ep, "cd G:\\study\\code\\matlab\\time");
engEvalString(ep, "black_friday(2011)");
printf("%s\n", buffer);

mxN = mxCreateDoubleScalar(3);
engPutVariable(ep, "N", mxN);
engEvalString(ep, "D=rand(N, N)");
mxData = engGetVariable(ep, "D");
printf("%s\n", buffer);

/* 创建矩阵 */
Y = mxCreateDoubleMatrix(1, 3, mxREAL);
/* 把数据存入矩阵 */
memcpy(mxGetPr(Y), temp, sizeof(temp));
/* 把矩阵存为matlab变量 */
engPutVariable(ep, "Y", Y);
engEvalString(ep, "X = ones(5,1) * Y");
/* 获取matlab变量 */
X = engGetVariable(ep , "X") ;
/* 操作多维数组 */
ndims = mxGetNumberOfDimensions(X);
printf("total number of dimensions is %d\n" , ndims);
memcpy(dims , mxGetDimensions(X) , ndims * sizeof(int));
for ( i = 0 ; i < ndims ; i ++ ) {
printf("dimension %d : %d\n" , i , dims[i]);
}
printf("\n");

/* 查看数据在内存中是如何存储的 */
p = (double*)mxGetData(X);
for ( i = 0 ; i < dims[0] ; i ++ ){
for ( j = 0 ; j < dims[1] ; j ++ ){
printf("%8.2f" , p[j * dims[0] + i]) ;
}
printf("\n") ;
}

/* 释放资源 */
mxDestroyArray(X);
mxDestroyArray(Y);

/* 关闭引擎 */
engClose(ep);

return(0);
}

 
7、参考

http://blog.sina.com.cn/s/blog_46da01db0100stvb.html

http://blog.sina.com.cn/s/blog_63106cd80100xz06.html




转载于:https://www.cnblogs.com/andavid/archive/2011/12/02/2272281.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值