我只使用了几个星期的mex函数,现在正在编写一个Runge,4阶求解器作为一个C++ mex函数。我想知道是否可以将一个函数作为输入。实际上,用MATLAB编写我的动力学函数并将其直接传递给我的RK4 mex函数是很好的。例如,如果动力学由Duffing方程控制,则用MATLAB编写:
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函数中调用动态函数,还是inputs[]仅被限制为数值类型?我尝试了以下几点:
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];
当然,这不起作用,因为输入不能分配给“TypedArray<double> (TypedArray<double>, TypedArray<double>)
”,因为我认为ArgumentList认为输入应该是纯数字的。有人能想到解决这个问题的方法吗,或者我只需要用C++编写我的动态函数?期待一些建议!托马斯
发布于 2021-02-12 10:33:37
只需快速浏览MATLABEngine::feval接口,您就可以使用MATLAB::C++::MATLABEngine::feval界面完成此操作:
723048 aa12 e22f-4 4bfb a12-47b8007da774
也就是说,将函数名作为字符串传递到C++ mex文件中,您可以通过matlab::ArgumentList语法获得该字符串:
void operator()(matlab::mex::ArgumentList outputs, matlab::mex::ArgumentList inputs) {
matlab::data::CharArray fname = inputs[0];
etc.
然后将fname转换为std::u16字符串,并在feval接口中使用它。
发布于 2021-02-12 15:10:25
除了@James的答案之外,还可以使用coder.extrinsic
在位于C++ Mex和Matlab函数之间的一个瘦代码生成的包装层中使用。
calls calls
C++ Mex layer ----> Code-Generated Matlab wrapper lib (coder.extrinsic) ----> Matlab function
然而,可能不是一个好的设计。我假设您使用C++是出于性能原因。暂停程序的执行,将数据从C++编组到Matlab是很慢的。如果您正在运行时间步进模拟,您可能会发现互操作代码成为性能瓶颈。更好的设计可能是调整您的动力学方程Matlab代码,使其成为代码生成,然后您可以直接从生成的C代码调用C++。
https://stackoverflow.com/questions/66175990
复制相似问题