Linux平台下C&C++与Matlab-混合编程相关技术文档.doc

上传人:聆听****声音 文档编号:18938925 上传时间:2024-03-02 格式:DOC 页数:13 大小:89.44KB
下载 相关 举报
Linux平台下C&C++与Matlab-混合编程相关技术文档.doc_第1页
第1页 / 共13页
Linux平台下C&C++与Matlab-混合编程相关技术文档.doc_第2页
第2页 / 共13页
Linux平台下C&C++与Matlab-混合编程相关技术文档.doc_第3页
第3页 / 共13页
Linux平台下C&C++与Matlab-混合编程相关技术文档.doc_第4页
第4页 / 共13页
Linux平台下C&C++与Matlab-混合编程相关技术文档.doc_第5页
第5页 / 共13页
Linux平台下C&C++与Matlab-混合编程相关技术文档.doc_第6页
第6页 / 共13页
Linux平台下C&C++与Matlab-混合编程相关技术文档.doc_第7页
第7页 / 共13页
Linux平台下C&C++与Matlab-混合编程相关技术文档.doc_第8页
第8页 / 共13页
Linux平台下C&C++与Matlab-混合编程相关技术文档.doc_第9页
第9页 / 共13页
Linux平台下C&C++与Matlab-混合编程相关技术文档.doc_第10页
第10页 / 共13页
Linux平台下C&C++与Matlab-混合编程相关技术文档.doc_第11页
第11页 / 共13页
Linux平台下C&C++与Matlab-混合编程相关技术文档.doc_第12页
第12页 / 共13页
Linux平台下C&C++与Matlab-混合编程相关技术文档.doc_第13页
第13页 / 共13页
亲,该文档总共13页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

Linux平台下C&C++与Matlab-混合编程相关技术文档.doc

《Linux平台下C&C++与Matlab-混合编程相关技术文档.doc》由会员分享,可在线阅读,更多相关《Linux平台下C&C++与Matlab-混合编程相关技术文档.doc(13页珍藏版)》请在冰点文库上搜索。

Linux平台下C&C++与Matlab-混合编程相关技术文档.doc

Linux平台下

C/C++与Matlab混合编程相关技术说明

拟制:

李邦柱

日期:

2014-9-5

审核:

日期:

批准:

日期:

文档编号:

YFZX-LIBZ-002

创建日期:

2014-9-5

最后修改日期:

2014-09-05

版本号:

V1.0

电子版文件名:

Linux平台下C/C++与Matlab混合编程相关技术说明.doc

文档修改记录

修改日期

修改人

修改说明

版本号

修改页

Linux平台下C与Matlab混合编程技术文档第13页共13页

13

目录

1概述 3

1.1Matlab简介 3

1.2什么是Matlab引擎 3

2启动Matlab前相关环境设置 4

2.1matlab引擎依赖条件 4

2.2matlab引擎依赖的动态库文件目录必须在系统当前的库函数搜索路径中 4

2.3用gcc或者g++编译 4

2.4相关环境设置总结:

4

3Matlab与C的接口函数介绍 5

3.1Matlab引擎的启动与关闭 5

3.2创建和清除mxArray类型的数据 6

3.3管理mxArray的数据类型 7

3.3.1管理mxArray数据大小 7

3.3.2判断mxArray数组类型 7

3.3.3管理mxArray数组的数据 8

3.4调用引擎时显示/隐藏Matlab主窗口 8

3.5读写Matlab数据 8

3.5.1从Matlab引擎工作空间中获取变量 8

3.5.2向Matlab引擎工作空间写入变量 9

3.6向Matlab发送命令字符串 9

3.7获取Matlab命令窗口的输出 9

4C调用Matlabquadprog函数接口示例 10

1概述

1.1Matlab简介

MATLAB是美国MathWorks公司出品的商业数学软件,用于算法开发、数据可视化、数据分析以及数值计算的高级技术计算语言和交互式环境,主要包括MATLAB和Simulink两大部分。

MATLAB应用非常之广泛!

MATLAB亦可以与其他高级语言C/C++/C#/Java/Fortran等进行混合编程。

1.2什么是Matlab引擎

所谓Matlab引擎(engine),是指一组Matlab提供的接口函数,支持C/C++、Fortran等语言,通过这些接口函数,用户可以在其它编程环境中实现对Matlab的控制。

2启动Matlab前相关环境设置

2.1matlab引擎依赖条件

matlab引擎依赖/bin/csh启动,所以不管你使用何种shell,都必须安装csh

#yuminstallchs(centos/redhat平台)

#apt-getinstallchs(ubuntu平台)

2.2matlab引擎依赖的动态库文件目录必须在系统当前的库函数搜索路径中

即可以设置环境

LD_LIBRARY_PATH=/usr/local/matlab/bin/glnx86(ps:

32环境下)

LD_LIBRARY_PATH=/usr/local/matlab/bin/glnxa64(ps:

64环境下)

2.3用gcc或者g++编译

编写好的程序编译时需要指定头文件目录,链接时需要指定库文件目录,并且需要指定所需要的库文件

相关命令如下:

#gcc-I/usr/local/matlab/extern/include-omatlab.omatlab.c

#gcc-L/usr/local/matlab/bin/glnx86-Wl,-rpath,/usr/local/matlab/bin/glnx86-omatlabmatlab.o-leng-lmx

2.4相关环境设置总结:

上述2.12.22.3对如何编译C与matlab进行了说明,但是步骤较多,程序编译较为繁琐。

因为我们可以通过一次环境变量的设置来达到这种目的。

exportPATH=$PATH:

"/usr/local/matlab/bin"

exportLD_LIBRARY_PATH=$LD_LIBRARY_PATH:

"/usr/local/matlab/bin/glnxa64"

exportC_INCLUDE_PATH=$C_INCLUDE_PATH:

"/usr/local/matlab/extern/include"

exportLIBRARY_PATH=$LIBRARY_PATH:

"/usr/local/matlab/bin/glnxa64"

把上述环境变量的设置写进文件名为xx.env的文件中,然后使用命令source执行

#sourcexx.env

执行完上述命令后就把所有的环境变量设置完毕。

接下来就可以用gcc/g++进行编译:

#gcctest.c-otest-leng-lmex-lmx

注:

/usr/local/matlab/此路径为Matlab安装时的路径,可根据实际情况进行变动。

3Matlab与C的接口函数介绍

3.1Matlab引擎的启动与关闭

engOpen-打开Matlabengine

函数声明:

Engine*engOpen(constchar*startcmd);

参数startcmd是用来启动Matlab引擎的字符串参数为NULL。

函数返回值是一个Engine类型的指针,它是在engine.h中定义的engine数据结构。

EngClose-关闭Matlab引擎

函数声明:

intengClose(Engine*ep);

参数ep代表要被关闭的引擎指针。

函数返回值为0表示关闭成功,返回1表示发生错误。

例如:

通常用来打开/关闭Matlab引擎的代码如下:

Engine*ep;//定义Matlab引擎指针。

if(!

(ep=engOpen(NULL)))//测试是否启动Matlab引擎成功。

{

perror("Can'tstartMatlabengine!

");

exit

(1);

}

………… 

engClose(ep);//关闭Matlab引擎。

 

3.2创建和清除mxArray类型的数据

Matlab有很多种变量类型,对应于每种类型,基本上都有一个函数用于创建,但它们都有相同的数据结构,就是mxArray。

数组的建立采用mxCreatexxx形式的函数,例如新建一个double类型数组,可用函数mxCreateDoubleMatrix,

函数声明:

mxArray*mxCreateDoubleMatrix(intm,intn,mxComplexityComplexFlag);

参数m和n为矩阵的函数和列数。

ComplexFlag为常数,用来区分矩阵中元素是实数还是复数,取值分别为mxREAL和mxCOMPLEX。

例如,创建一个3行5列的二维实数数组,可用如下语句:

mxArray*T=mxCreateDoubleMatrix(3,5,mxREAL);

对应的,要删除一个数组mxDestroyArray,该函数声明如下:

voidmxDestroyArray(mxArray*array_ptr);

参数array_ptr为要删除的数组指针。

类似的创建函数还有:

函数声明:

mxArray*mxCreateString(constchar*str);

创建一个字符串类型并初始化为str字符串。

一般的在C与Matlab交互中,以上两种类型就够了,其它类型数组的创建这里不再介绍。

3.3管理mxArray的数据类型

3.3.1管理mxArray数据大小

要获得mxArray数组每一维上元素的个数,可以用mxGetM和mxGetN函数。

其中mxGetM用来获得数组第一维的元素个数,对于矩阵来说就是行数。

intmxGetM(constmxArray*array_ptr);//返回array_ptr对应数组第一维的元素个数(行数)

intmxGetN(constmxArray*array_ptr);//返回array_ptr对应数组其它维的元素个数,对于矩阵来说是列数。

对于多维数组来说是从第2维到最后一维的各维元素个数的乘积。

要获得某一特定维的元素个数,则要用函数:

constint*mxGetDimensions(constmxArray*array_ptr);

该函数返回array_ptr各维的元素个数保存在一个int数组中返回。

对于常用的矩阵来说,用mxGetM和mxGetN两个函数就可以了。

另外还可以通过mxGetNumberOfDimensions来获得数组的总的维数,用mxSetM、mxSetN设置矩阵的行数和列数,函数说明如下:

intmxGetNumberOfDimensions(constmxArray*array_ptr);//返回数组的维数

voidmxSetM(mxArray*array_ptr,intm);//设置数组为m行

voidmxSetN(mxArray*array_ptr,intn);//设置数组为n列

3.3.2判断mxArray数组类型

在对mxArray类型的变量进行操作之前,可以验证以下其中的数组的数据类型,比如是否为double数组、整数、字符串、逻辑值等,以及是否为某种结构、类、或者是特殊类型,比如是否为空数组,是否为inf、NaN等。

常见的判断函数有:

boolmxIsDouble(constmxArray*array_ptr);

boolmxIsComplex(constmxArray*array_ptr);

boolmxIsChar(constmxArray*array_ptr);

boolmxIsEmpty(constmxArray*array_ptr);

boolmxIsInf(doublevalue);

…………

这些函数比较简单,不再解释。

3.3.3管理mxArray数组的数据

对于常用的double类型的数组,可以用mxGetPr和mxGetPi两个函数分别获得其实部和虚部的数据指针,这两个函数的声明如下:

double*mxGetPr(constmxArray*array_ptr);//返回数组array_ptr的实部指针

double*mxGetPi(constmxArray*array_ptr);//返回数组array_ptr的虚部指针

这样,就可以通过获得的指针对mxArray类型的数组中的数据进行读写操作。

例如可以用函数engGetVariable从Matlab工作空间读入mxArray类型的数组,然后用mxGetPr和mxGetPi获得数据指针,对并其中的数据进行处理,最后调用engPutVariable函数将修改后的数组重新写入到Matlab工作空间。

3.4调用引擎时显示/隐藏Matlab主窗口

默认情况下,以engine方式调用Matlab的时候,会打开Matlab主窗口,可在其中随意操作。

但有时也会干扰应用程序的运行,可用以下设置是否显示该窗口。

函数声明:

intengSetVisible(Engine*ep,boolvalue);

参数ep为打开的Matlab引擎指针,value为是否显示的标志,取值true(或1)表示显示Matlab窗口,取值false(或0)表示隐藏Matlab窗口。

函数返回值为0表示设置成功,为1表示有错误发生。

要获得当前Matlab窗口的显示/隐藏情况,可以调用函数:

函数声明:

intengGetVisible(Engine*ep,bool*value);

参数ep为打开的Matlab引擎指针,Value为用来保存显示/隐藏情况的变量(采用指针方式传递)。

函数返回值为0表示获取成功,为1表示有错误发生。

3.5读写Matlab数据

3.5.1从Matlab引擎工作空间中获取变量

函数声明:

mxArray*engGetVariable(Engine*ep,constchar*name);

参数ep为打开的Matlab引擎指针,name为以字符串形式指定的数组名。

函数返回值是指向name数组的指针

3.5.2向Matlab引擎工作空间写入变量

函数声明:

intengPutVariable(Engine*ep,constchar*name,constmxArray*mp);

参数ep为打开的Matlab引擎指针,mp为指向被写入变量的指针,name为变量写入后在Matlab引擎工作空间中的变量名。

函数返回值为0表示写入变量成功,返回值为1表示发生错误。

3.6向Matlab发送命令字符串

engEvalString-发送命令让Matlab执行。

函数声明:

intengEvalString(Engine*ep,Constchar*string);

参数ep为函数engOpen返回的引擎指针,字符串string为要matlab执行的命令。

函数返回值为0表示成功执行,返回1说明执行失败(如命令不能被Matlab正确解释或Matlab引擎已经关闭了)。

3.7获取Matlab命令窗口的输出

要在C中获得函数engEvalString发送的命令字符串被Matlab执行后在matlab窗口中的输出,可以调用engOUtputBuffer函数。

函数声明:

intengOutputBuffer(Engine*ep,char*p,intn);

参数ep为Matlab引擎指针,p为用来保存输出结构的缓冲区,n为最大保存的字符个数,通常就是缓冲区p的大小。

该函数执行后,接下来的engEvalString函数所引起的命令行输出结果会在缓冲区p中保存。

如果要停止保存,只需调用代码:

engOutputBuffer(ep,NULL,0)。

4C调用Matlabquadprog函数接口示例

/*

Author:

bangzhu.li

Date:

2014/09

Instruction:

Thissoftwareprogramisonlyusedasanexample,notanerrorexceptionhandling.

E-mail:

helpylee@

*/

#include

#include

#include

#include"engine.h"

#include

intmain(intargc,char**argv)

{

Engine*ep;

if(!

(ep=engOpen("\0")))//启动matlab引擎

{

fprintf(stderr,"\nCan'tstartMATLABengine\n");

returnEXIT_FAILURE;

}

engSetVisible(ep,false);

mxArray*H=NULL,*f=NULL,*A=NULL,*b=NULL,*lb=NULL,*x=NULL;

H=mxCreateDoubleMatrix(2,2,mxREAL);

f=mxCreateDoubleMatrix(2,1,mxREAL);

A=mxCreateDoubleMatrix(3,2,mxREAL);

b=mxCreateDoubleMatrix(3,1,mxREAL);

lb=mxCreateDoubleMatrix(2,1,mxREAL);

x=mxCreateDoubleMatrix(2,1,mxREAL);

doubleHH[2][2]={1,-1,-1,2};

doubleff[2][1]={-2,-6};

doubleAA[3][2]={1,1,-1,2,2,1};

doublebb[3][1]={2,2,3};

doublellbb[2][1]={0,0};

doublexx[2][1]={0,0};

//把C数组转换为Matlab数组

memcpy((void*)mxGetPr(H),(void*)HH,sizeof(double)*2*2);

memcpy((void*)mxGetPr(f),(void*)ff,sizeof(double)*2*1);

memcpy((void*)mxGetPr(A),(void*)AA,sizeof(double)*3*2);

memcpy((void*)mxGetPr(b),(void*)bb,sizeof(double)*3*1);

memcpy((void*)mxGetPr(lb),(void*)llbb,sizeof(double)*2*1);

memcpy((void*)mxGetPr(x),(void*)xx,sizeof(double)*2*1);

//把数组变量写入Matlab环境中

engPutVariable(ep,"H",H);

engPutVariable(ep,"f",f);

engPutVariable(ep,"A",A);

engPutVariable(ep,"b",b);

engPutVariable(ep,"lb",lb);

engPutVariable(ep,"x",x);

//执行字符串命令

intret1=engEvalString(ep,"H=[1-1;-12];");

intret2=engEvalString(ep,"f=[-2;-6];");

intret3=engEvalString(ep,"A=[11;-12;21];");

intret4=engEvalString(ep,"b=[2;2;3];");

intret5=engEvalString(ep,"lb=zeros(2,1);");

intret6=engEvalString(ep,"[x]=quadprog(H,f,A,b,[],[],lb,[],[]);");

charp[256]={0};

charp1[256]={0};

char*ans="disp(x(1,1));";

char*ans2="disp(x(2,1));";

engOutputBuffer(ep,p,240);

engEvalString(ep,ans);

printf("p:

%s\n",p);

engOutputBuffer(ep,p1,240);

engEvalString(ep,ans2);

printf("p1:

%s,\n",p1);

mxDestroyArray(H);

mxDestroyArray(f);

mxDestroyArray(A);

mxDestroyArray(b);

mxDestroyArray(x);

engClose(ep);

return0;

}

如有疑问请详询:

helpylee@

更多内容请前往:

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > IT计算机 > 电脑基础知识

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2