在这里通过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); end2)编写main.cpp,它通过matlab engine来调用matlab中的函数myFunc.m
#include <iostream> #include <math.h> #include "engine.h" #include <string.h> #include <vector> 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!"<<endl; return EXIT_FAILURE; } // 定义一个一维数组 double cArray[N]; // input some numbers, just for test. cout<<"Please input "<<N<<" numbers, seperated by space. Then press enter! "<<endl; 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<<"C++ output: the sum of all the elements is: " << p[0] <<endl; //释放内存 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