我只使用了几个星期的mex函数,现在正致力于编写一个龙格-库塔四阶求解器作为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)(无论什么)also)
是否有一种方法可以从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并在eval接口中使用。
除了@James的回答之外,还可以在c++ Mex和Matlab函数之间的瘦代码生成包装层中使用coder.extrinsic
。
calls calls
C++ Mex layer ----> Code-Generated Matlab wrapper lib (coder.extrinsic) ----> Matlab function
然而,这可能不是一个好的设计。我假设您是出于性能原因而使用c++。暂停程序的执行,将数据从c++编组到Matlab是缓慢的。如果您正在运行时间步进模拟,您可能会发现互操作代码成为性能瓶颈。一个更好的设计可能是适应你的动力学方程Matlab代码,使其代码可生成,然后你可以调用c++直接从生成的C代码。