Linux下c++调用自己编写的matlab函数:通过matlab引擎实现

在这里通过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 <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

你可能感兴趣的:(linux,matlab)