c 调用 matlab engine 自定义函数

本文介绍如何在Visual Studio中配置MATLAB R2009a进行C++与MATLAB混合编程。主要内容包括设置包含目录及库文件路径、链接器属性等。通过示例程序演示了从C++调用MATLAB函数的过程。

设置:

1. Tools/Projects and Solutions/VC ++ Directories

    Inlcude files: C:/Program Files/MATLAB/R2009a/extern/include

    Library files: C:/Program Files/MATLAB/R2009a/extern/lib

2. Property

    Configuration Properties/Linker

    General: Additional Library Directories: "C:/Program Files/MATLAB/R2009a/extern/lib/win32/microsoft"

    Input: Additional Dependencies: libmx.lib libmat.lib libeng.lib

 

 

   

#include

"stdafx.h"

#include

#include

#include

#include

 

fun_XY.m file

 

function Z = fun_XY(X,Y)

Z = X*Y;

 

<stdio.h><stdlib.h><conio.h>"engine.h"

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

int

 

 

main(int argc, char

**argv)

{

 

 

double

X[3][2] = {{1,4},{2,5},{3,6}};

 

 

double

Y[2][2] = {{1,2},{3,4}};

 

 

int

succeedNotFlag = 1;

Engine *ep;

 

 

if

(!(ep = engOpen(NULL)))

{

exit(1);

}

engSetVisible(ep,1);

mxArray *xx = mxCreateDoubleMatrix(3,2,mxREAL);

mxArray *yy = mxCreateDoubleMatrix(2,2,mxREAL);

memcpy(mxGetPr(xx),X,6*

 

sizeof(double

));

memcpy(mxGetPr(yy),Y,4*

 

sizeof(double

));

engPutVariable(ep,

 

"X"

,xx);

engPutVariable(ep,

 

"Y"

,yy);

 

 

int

rows = mxGetM(xx);

 

 

int

cols = mxGetN(xx);

 

 

////succeedNotFlag = engEvalString(ep,"cd D://progX//CM//mt");

 

 

//succeedNotFlag = engEvalString(ep,"path(path,'D:/progX/CM/mt')"); //will not go to the right routine.

succeedNotFlag = engEvalString(ep,

 

"path(path,'D://progX//CM//mt')");

////will go to the right routine.

succeedNotFlag = engEvalString(ep,

 

"Z = fun_XY_lan(X,Y);"

);

mxArray *z_ptr = NULL;

z_ptr = engGetVariable(ep,

 

"Z"

);

 

 

double *z_c = new double

[6];

z_c = (

 

double

*) mxGetData(z_ptr);

mxDestroyArray(xx);

mxDestroyArray(yy);

 

 

delete

[]z_c;

engClose(ep);

 

 

return

0;

### 如何在 Qt 中使用 MATLAB Engine API 调用 Matlab 函数 #### 初始化 MATLAB 引擎 为了能够在 Qt 应用程序调用 MATLAB 函数,首先需要初始化 MATLAB 引擎。这可以通过 `engOpen` 或者更现代的方式通过 C++ 类 `matlab::engine::startMATLAB()` 来完成。 ```cpp #include "matlab.engine/Engine.h" using namespace matlab::engine; // 启动MATLAB引擎实例 std::unique_ptr<MATLABEngine> engine = startMATLAB(); ``` 这段代码展示了如何利用 C++ 的 RAII 特性自动管理资源生命周期[^2]。 #### 执行简单命令 一旦成功启动了 MATLAB 引擎,就可以执行简单的字符串形式的 MATLAB 命令: ```cpp FutureResult result = engine->evalAsync(u"disp('Hello from MATLAB')"); result.wait(); // 等待直到命令被执行完毕 ``` 这里展示的是异步方式发送命令到 MATLAB 并等待其完成。 #### 数据交换 当涉及到复杂的数据结构时,比如矩阵运算,则可能需要用特定的方法来进行数据转换和传递。例如向 MATLAB 发送一个双精度浮点数数组作为输入参数,并接收另一个数组作为输出结果: ```cpp // 创建一个包含两个元素 {1.0, 2.0} 的 std::vector<double> std::vector<double> inputVector{1.0, 2.0}; // 将 C++ vector 转换为 MATLAB 数组对象 ArrayFactory 和 TypedArray<double> auto factory = std::make_shared<ArrayFactory>(); TypedArray<double> matInput = factory->createArray({inputVector.size()}, inputVector.data()); // 调用 add 函数并将输入传入其中 std::future<std::shared_ptr<matlab::data::StructArray>> futureOutput = engine->fevalAsync(u"add", 1, matInput); // 获取计算后的结果 std::shared_ptr<matlab::data::StructArray> output = futureOutput.get(); // 解析返回的结果... double sumValue; (*output)[0][u"sum"].read(sumValue); ``` 此部分说明了怎样准备输入数据并通过 `fevalAsync` 方法同步地调用了名为 “add”的 MATLAB 函数[^3]。 #### 关闭 MATLAB 引擎 最后,在不再需要 MATLAB 功能的时候应当正确关闭它以释放占用的资源: ```cpp if (p_engine_) { engClose(p_engine_); } ``` 上述操作确保了应用程序结束前清理掉了所有与 MATLAB 相关的对象[^4]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值