Linux平台下CC++与Matlab 混合编程相关技术文档Word文档格式.docx
- 文档编号:22577377
- 上传时间:2023-02-04
- 格式:DOCX
- 页数:12
- 大小:20.46KB
Linux平台下CC++与Matlab 混合编程相关技术文档Word文档格式.docx
《Linux平台下CC++与Matlab 混合编程相关技术文档Word文档格式.docx》由会员分享,可在线阅读,更多相关《Linux平台下CC++与Matlab 混合编程相关技术文档Word文档格式.docx(12页珍藏版)》请在冰豆网上搜索。
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
概述
Matlab简介
MATLAB是美国MathWorks公司出品的商业数学软件,用于算法开发、数据可视化、数据分析以及数值计算的高级技术计算语言和交互式环境,主要包括MATLAB和Simulink两大部分。
MATLAB应用非常之广泛!
MATLAB亦可以与其他高级语言C/C++/C#/Java/Fortran等进行混合编程。
什么是Matlab引擎
所谓Matlab引擎(engine),是指一组Matlab提供的接口函数,支持C/C++、Fortran等语言,通过这些接口函数,用户可以在其它编程环境中实现对Matlab的控制。
启动Matlab前相关环境设置
matlab引擎依赖条件
matlab引擎依赖/bin/csh启动,所以不管你使用何种shell,都必须安装csh
#yuminstallchs(centos/redhat平台)
#apt-getinstallchs(ubuntu平台)
matlab引擎依赖的动态库文件目录必须在系统当前的库函数搜索路径中
即可以设置环境
LD_LIBRARY_PATH=/usr/local/matlab/bin/glnx86(ps:
32环境下)
LD_LIBRARY_PATH=/usr/local/matlab/bin/glnxa64(ps:
64环境下)
用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.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:
把上述环境变量的设置写进文件名为xx.env的文件中,然后使用命令source执行
#sourcexx.env
执行完上述命令后就把所有的环境变量设置完毕。
接下来就可以用gcc/g++进行编译:
#gcctest.c-otest-leng-lmex-lmx
注:
/usr/local/matlab/此路径为Matlab安装时的路径,可根据实际情况进行变动。
Matlab与C的接口函数介绍
Matlab引擎的启动与关闭
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引擎。
创建和清除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交互中,以上两种类型就够了,其它类型数组的创建这里不再介绍。
管理mxArray的数据类型
管理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列
判断mxArray数组类型
在对mxArray类型的变量进行操作之前,可以验证以下其中的数组的数据类型,比如是否为double数组、整数、字符串、逻辑值等,以及是否为某种结构、类、或者是特殊类型,比如是否为空数组,是否为inf、NaN等。
常见的判断函数有:
boolmxIsDouble(constmxArray*array_ptr);
boolmxIsComplex(constmxArray*array_ptr);
boolmxIsChar(constmxArray*array_ptr);
boolmxIsEmpty(constmxArray*array_ptr);
boolmxIsInf(doublevalue);
…………
这些函数比较简单,不再解释。
管理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工作空间。
调用引擎时显示/隐藏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表示有错误发生。
读写Matlab数据
从Matlab引擎工作空间中获取变量
mxArray*engGetVariable(Engine*ep,constchar*name);
参数ep为打开的Matlab引擎指针,name为以字符串形式指定的数组名。
函数返回值是指向name数组的指针
向Matlab引擎工作空间写入变量
intengPutVariable(Engine*ep,constchar*name,constmxArray*mp);
参数ep为打开的Matlab引擎指针,mp为指向被写入变量的指针,name为变量写入后在Matlab引擎工作空间中的变量名。
函数返回值为0表示写入变量成功,返回值为1表示发生错误。
向Matlab发送命令字符串
engEvalString-发送命令让Matlab执行。
intengEvalString(Engine*ep,Constchar*string);
参数ep为函数engOpen返回的引擎指针,字符串string为要matlab执行的命令。
函数返回值为0表示成功执行,返回1说明执行失败(如命令不能被Matlab正确解释或Matlab引擎已经关闭了)。
获取Matlab命令窗口的输出
要在C中获得函数engEvalString发送的命令字符串被Matlab执行后在matlab窗口中的输出,可以调用engOUtputBuffer函数。
intengOutputBuffer(Engine*ep,char*p,intn);
参数ep为Matlab引擎指针,p为用来保存输出结构的缓冲区,n为最大保存的字符个数,通常就是缓冲区p的大小。
该函数执行后,接下来的engEvalString函数所引起的命令行输出结果会在缓冲区p中保存。
如果要停止保存,只需调用代码:
engOutputBuffer(ep,NULL,0)。
C调用Matlabquadprog函数接口示例
/*
Author:
bangzhu.li
Date:
2014/09
Instruction:
Thissoftwareprogramisonlyusedasanexample,notanerrorexceptionhandling.
E-mail:
helpylee@
*/
#include<
stdio.h>
math.h>
stdlib.h>
#include"
engine.h"
string.h>
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);
f"
f);
engPutVariable(ep,"
A"
A);
b"
b);
lb"
lb);
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);
p1:
%s,\n"
p1);
mxDestroyArray(H);
mxDestroyArray(f);
mxDestroyArray(A);
mxDestroyArray(b);
mxDestroyArray(x);
engClose(ep);
return0;
如有疑问请详询:
更多内容请前往:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Linux平台下CC+与Matlab 混合编程相关技术文档 Linux 平台 CC Matlab 混合 编程 相关 技术 文档