c调用matlab linux,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

#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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值