(MATLAB/C++) 是否可以将函数作为参数传递给 C++ MEX 函数?

问题描述

我只使用了 mex 函数几个星期,现在正在编写 Runge-Kutta,四阶求解器作为 C++ mex 函数。 我想知道是否可以将函数作为输入。 实际上,用 MATLAB 编写我的动力学函数并将其直接传递给我的 RK4 mex 函数会很好。 例如,如果动力学由用 MATLAB 编写的 Duffing 方程控制:

function xdot = Duffing(t,x)
xdot = [x(2); 0.3*cos(t)-0.22*x(2)+x(1)-x(1)^3];
end

(我确实意识到这也可以写成 Duffing = @(t,x)(随便)

有没有办法从 mex 函数中调用动态函数,或者输入 [] 仅限于数字类型? 我尝试了以下方法:

class MexFunction : public matlab::mex::Function {
public:
    void operator()(ArgumentList outputs,ArgumentList inputs) {
        
//     Access the dynamics function
        typedef TypedArray<double> xdot_type (TypedArray<double>,TypedArray<double>);
        xdot_type xdot;
        xdot = inputs[0];
    

当然,这不起作用,因为输入[0] 不能分配给'TypedArray<double> (TypedArray<double>,TypedArray<double>)',因为我认为ArgumentList 认为输入[0] 应该是纯数字。 任何人都可以想出解决方案,还是我只需要用 C++ 编写动态函数? 期待一些建议! 托马斯

解决方法

只需快速浏览 MATLAB C++ API 文档,您似乎可以使用此处找到的 matlab::engine::MATLABEngine::feval 接口执行此操作:

https://www.mathworks.com/help/matlab/matlab_external/cpp-mex-api.html?searchHighlight=fevalAsync&s_tid=srchtitle#mw_723048ca-e22f-4bfb-aa12-47b8007da774

即,将您的函数名称作为字符串传递到 C++ mex 文件中,您可以通过 matlab::data::CharArray 语法从 ArgumentList 中获取该字符串:

void operator()(matlab::mex::ArgumentList outputs,matlab::mex::ArgumentList inputs) {
    matlab::data::CharArray fname = inputs[0];
    etc.

然后将 fname 转换为 std::u16string 并在 feval 界面中使用。

,

除了@James 的回答之外,还可以在位于 C++ Mex 和您的 Matlab 函数之间的薄代码生成包装层中使用 coder.extrinsic

              calls                                                     calls
C++ Mex layer ----> Code-Generated Matlab wrapper lib (coder.extrinsic) ----> Matlab function

但是,这可能不是一个好的设计。我假设您出于性能原因使用 C++。暂停程序的执行,将数据从 C++ 编组到 Matlab 是很慢的。如果您正在运行时间步进模拟,您可能会发现互操作代码成为性能瓶颈。更好的设计可能是调整您的动力学方程 Matlab 代码,使其code-generatable,然后您可以直接从生成的 C 代码中调用 C++。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...