在这里通过mcc将.m函数编译成动态链接库供c++调用的方式实现了c++程序调用matlab的m函数的功能。本文将尝试另外一种途径,通过matlab引擎来实现c++调用matlab中自己编写的m函数。既然之前已经配置好matlab引擎,配置完以后就可以通过引擎提供的函数engEvalString,向matlab发送命令。直接调用matlab自带的函数(比如:plot, besselj等等都可以直接用了。),那么也就意味着只需要让matlab能找到自定义的m函数就可以。下面做了个小实验。平台是:ubuntu 12.04.5 + g++4.6 + matlab2012a。
问题描述:
有一个c++程序main.cpp,和一个matlab函数myFunc.m。现在要做这件事:
1)从main.cpp中传递一个1行5列的double类型的array到myFunc.m中
2)myFunc.m中求和
3)main.cpp中接收myFunc.m返回的和并输出。
思路:
在c++中输入这些数值,然后c++函数启动matlab引擎将这些值传递到myFunc.m中,运算后的结果通过引擎传递回c++。因为matlab引擎专门提供了一套接口将c/c++和matlab数据类型进行转换,实现2者的通讯。比如:engEvalString,engPutVariable,engGetVariable等。
步骤:
1)myFunc.m内容如下:
function [ c ] = myFunc(A)
% for c++ to get the return value, myFunc must have a return value
c = sum(A);
end
2)编写main.cpp,它通过matlab engine来调用matlab中的函数myFunc.m
#include
#include
#include "engine.h"
#include
#include
using namespace std;
int main() {
const int N = 5;
// 定义Matlab引擎指针。
Engine *ep;
if (!(ep=engOpen("\0"))) //if start successfully, the pointer ep will not be NULL.
{
cout<< "Can't start MATLAB engine!"<
return EXIT_FAILURE;
}
// 定义一个一维数组
double cArray[N];
// input some numbers, just for test.
cout<
cin >> cArray[0] >> cArray[1] >> cArray[2] >> cArray[3] >> cArray[4];
//定义mxArray,为M行,N列的实数数组。
mxArray *xx = mxCreateDoubleMatrix(1, N, mxREAL);
//将c++数组中的值复制到对应的mxArray中
memcpy(mxGetPr(xx), cArray, N*sizeof(double));
//将mxArray数组xx写入到Matlab工作空间,命名为xx。
engPutVariable(ep, "input_data", xx);
// 调用自己的函数,求和。
engEvalString(ep, "addpath('~/WorkSpace/matlabEngine_example2');");
engEvalString(ep, "RESULT=myFunc(input_data);"); // 1. the computation result is set to RESULT
mxArray *result = engGetVariable(ep, "RESULT"); // 2. get the result
double *p = mxGetPr(result); //p[0]就是计算结果
cout<
//释放内存
mxDestroyArray(xx);
mxDestroyArray(result);
engClose(ep); //关闭Matlab引擎。
return EXIT_SUCCESS;
}
3)编译,运行,结果展示
$ g++ -o main main.cpp -leng -lmx
$ ./main
Please input 5 numbers, seperated by space. Then press enter!
5 5 5 5 5
C++ output: the sum of all the elements is: 25