关于在Ubuntu系统下C++调用matlab程序的方法详解,我整理了以下的攻略:
确认安装及配置
在开始调用matlab程序前,必须要确认系统已安装matlab软件及其C++编译器。同时,也需要设置matlab的环境变量来确保matlab程序能够被其他程序调用。
确认安装matlab
首先,可以在终端中输入以下命令,确认matlab是否已正确安装:
matlab -version
如果matlab已成功安装,则会在终端中显示matlab的版本信息。
确认C++编译器的安装
为了能够编译调用matlab程序的C++代码,需要确认系统是否已安装了C++编译器,如g++。可以在终端中输入以下命令,确认编译器是否已经安装:
g++ --version
如果编译器已成功安装,则会在终端中显示g++的版本信息。
设置matlab环境变量
确认matlab和g++已正确安装后,需要设置matlab环境变量,使其能够被其他程序调用。可以在终端中输入以下命令:
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/path/to/matlab/runtime/glnxa64:/path/to/matlab/bin/glnxa64:/path/to/matlab/sys/os/glnxa64
需要根据自己安装matlab的路径进行设置,并将其添加至系统环境变量中。
C++调用matlab程序
在确认环境配置无误后, 可以使用C++代码来调用matlab程序。以下是一个简单的例子:
#include"engine.h"
#include<stdio.h>
#include<iostream>
#include<memory.h>
int main()
{
std::cout << "Hello, world!" << std::endl;
Engine *ep;
ep=engOpen(NULL);
if(ep==NULL)
{
printf("Can't open Matlab engine\n");
exit(-1);
}
mxArray *x = NULL,*y=NULL;
double *a,*b;
a = (double*)malloc(sizeof(double)*10);
b = (double*)malloc(sizeof(double)*10);
memset(b, 0, 10);
for(int i=0;i<10;++i)
{
a[i] = (double)i+1;
}
x = mxCreateDoubleMatrix(1,10,mxREAL);
memcpy((void*)mxGetPr(x),a,sizeof(double)*10);
engPutVariable(ep,"x",x);
engEvalString(ep,"y=x.*2;");
y = engGetVariable(ep,"y");
memcpy((void*)b,mxGetPr(y),sizeof(double)*10);
for(int i=0;i<10;++i)
{
std::cout << b[i] << " ";
}
std::cout << std::endl;
mxDestroyArray(x);
mxDestroyArray(y);
free(a);
free(b);
engClose(ep);
return 0;
}
以上的代码是一个简单的C++程序,它可以将一个数组中的每个元素乘以2,然后输出结果。具体的调用过程可以参考代码中的注释。
示例一
下面的示例将展示如何使用C++程序调用一个matlab脚本。
(1)创建一个名为“matlab_script.m”的matlab脚本,其中包含以下代码:
x=1:0.1:10;
y=sin(x);
plot(x,y);
这段代码的作用是使用matlab绘制一个sin曲线。
(2)根据上面的代码,我们可以编写以下的C++程序:
#include <iostream>
#include <stdio.h>
#include "engine.h"
int main()
{
Engine* eng = engOpen(NULL);
engEvalString(eng, "cd ~/path/to/matlab_script/");
engEvalString(eng, "matlab_script");
engClose(eng);
return 0;
}
这段代码的作用是使用C++程序调用matlab脚本“matlab_script.m”,绘制sin曲线。需要注意的是,需要用“engEvalString”函数来执行matlab的命令。
(3)编译C++程序,执行以下命令:
g++ -o call_matlab call_matlab.cpp -I/opt/matlab/r2016a/extern/include -L/opt/matlab/r2016a/bin/glnxa64/ -leng -lmat -lmx -lut -ldl
需要根据matlab的安装路径来修改include和lib路径。最后运行该程序,即可看到绘制出的sin曲线。
示例二
下面的示例将展示如何使用C++程序调用一个matlab函数。
(1)创建一个名为“my_power.m”的matlab函数脚本,其中包含以下代码:
function result=my_power(x,n)
result=x.^n;
end
这段代码的作用是将数组x中的每个元素都做n次方操作。
(2)根据上面的代码,我们可以编写以下的C++程序:
#include <iostream>
#include "engine.h"
int main()
{
Engine* ep = engOpen(NULL);
if (!ep) {
std::cerr << "Error: Can't open engine" << std::endl;
return 1;
}
double a[4] = { 1, 2, 3, 4 };
mxArray* mat = mxCreateDoubleMatrix(1, 4, mxREAL);
memcpy(mxGetPr(mat), (void*)a, sizeof(double)*4);
if (engPutVariable(ep, "arr", mat)) {
std::cerr << "Error: Can't write variable arr" << std::endl;
return 1;
}
engEvalString(ep, "addpath('~/path/to/matlab_script/')");
engEvalString(ep, "result=my_power(arr, 2);");
mxArray* result = engGetVariable(ep, "result");
if (!mxIsDouble(result) || mxGetNumberOfDimensions(result) != 2) {
std::cerr << "Error: result is not a matrix" << std::endl;
return 1;
}
double* pr = mxGetPr(result);
const mwSize* dim = mxGetDimensions(result);
std::cout << "Result:" << std::endl;
for (int i = 0; i < dim[1]; i++) {
std::cout << pr[i] << std::endl;
}
mxDestroyArray(mat);
mxDestroyArray(result);
engClose(ep);
return 0;
}
这段代码的作用是调用“my_power”函数,对数组进行n次方操作并返回结果。需要注意的是,需要用“engPutVariable”函数把变量上传到matlab工作空间中,使用“engGetVariable”函数获取结果。
(3)编译以上代码,执行以下命令:
g++ -o call_matlab call_matlab.cpp -I/opt/matlab/r2016a/extern/include -L/opt/matlab/r2016a/bin/glnxa64/ -leng -lmat -lmx -lut -ldl
需要根据matlab的安装路径来修改include和lib路径。最后运行该程序,即可看到结果。
这就是在Ubuntu系统下C++调用matlab程序的方法详解!如果还有疑问或者需要进一步的帮助,请随时向我提问(^U^)ノ~YO
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:ubuntu系统下C++调用matlab程序的方法详解 - Python技术站