加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

Linux下C和matlab混合编程学习(1)

(2012-04-09 20:46:28)
标签:

linux

matlab

c

绘图

混合编程

分类: 程序Linux电脑学习
1.编译m文件为可执行文件
mex -setup设置好了c编译器之后。
写个简单函数test.m
function test
x=0:0.01:2*pi;
y=sin(x);
plot(x,y)
保存.
编译mcc -m test.m
就会生成可执行的文件test和一个脚本run_test.h
./run_test.h <matlab_root>/bin

2.C中调用matlab计算引擎(绘图等)
步骤:
(1)安装csh;
(2)设置:动态库路径LD_LIBRARY_PATH中添加<matlab_root>/bin/<Arch>; 
         PATH路径中添加<matlab_root>/bin
(3)编译:gcc test.c -o test -I $HOME/MATLAB/R2011b/extern/include -L $HOME/MATLAB/R2011b/bin/glnx86/ -leng -lmx -lmex
 (注意cpu是x86还是a64)
(4)运行:./test

其中第(2)步设置,在~/.bashrc中添加:
MATLAB="Matlab_Installed_Directory" (比如说我的安在了$HOME/MATLAB/R2011b下面,所以应该写全到2011b)
export PATH=~/Program:$MATLAB/bin:$PATH
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$MATLAB/bin/glnx86 #这里注意cpu是x86还是a64
export C_INCLUDE_PATH=$C_INCLUDE_PAT:$MATLAB/extern/include
export LIBRARY_PATH=$LIBRARY_PATH:$MATLAB/bin/glnx86
(前面两行是一个是可执行文件搜索路径,一个是动态库搜索路径,后面两个是gcc编译时的include头文件搜索路径和动态库搜索路径)
这样第三步编译就可以简单的写为:
gcc test.c -o test -leng -lmx -lmex


源文件test.c如下:

#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "engine.h"

#define N 500

main()
{
int i;
double x[N],y[N];
Engine *ep;

for(i=0;i<N;i++){
x[i]=0.01*i;
y[i]=sin(x[i]);
}

//启动matlab计算引擎,异常处理
if(!(ep=engOpen(NULL))){
printf("Can't start Matlab engine!");
exit(1);
}

//定义mxArray
mxArray *xx=mxCreateDoubleMatrix(1,N,mxREAL);
mxArray *yy=mxCreateDoubleMatrix(1,N,mxREAL);

//将数组复制到mxArray
memcpy(mxGetPr(xx),x,N*sizeof(double));
memcpy(mxGetPr(yy),y,N*sizeof(double));

//将mxArray数组写入到Matlab工作空间,并命名
engPutVariable(ep,"xx",xx);
engPutVariable(ep,"yy",yy);

//向Matlab引擎发送画图命令
engEvalString(ep,"plot(xx,yy);");

printf("Press 'Enter' to exit!");
getchar();

//销毁mxArray数组
mxDestroyArray(xx);
mxDestroyArray(yy);

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

}

有图为证:

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有