在Matlab中包装c ++代码以访问Matlab中的程序状态信息

时间:2013-02-05 17:05:04

标签: c++ matlab mex

我有一个更新系统的c ++程序。当我用C ++编写所有内容时,它看起来有点像这样

System S; //initialize a System object 'S'
while (notFinished)
{
    S.update1(inputVars1);
    S.update2(inputVars2);
}

现在我想从matlab调用各个更新函数,并且能够在matlab中调试时随时使用访问函数(用c ++编写)来查看程序的状态。

所以matlab需要调用一些东西来实例化一个“System”对象,然后它需要从原始系统对象中调用各个System方法。

假设我将单独的mex文件编译为Initialize update1 update2以及一些获取有关当前状态getState的信息。然后写一些matlab代码......

%matlab main
S = Initalize(); %mex file
while (notFinished)
    update1(S); %mex file
    keyboard; % access state information using "getState" mex function
    update2(S); %mex file
    keyboard; % access state information using "getState" mex function
end

这实际上是否允许我在Matlab中调用和调试我的C ++程序算法,还是有另一种方法可以解决这个问题?

1 个答案:

答案 0 :(得分:1)

我这样做的方法是使用“new”在Initialize mex函数中为C ++中的System创建一个指针。如果您使用的是64位平台,则将此指针强制转换为64位整数,并创建具有该类型和值的mxArray。从Initialize函数返回此mxArray。

对于以后调用其他mex文件,您应该将此mxArray作为输入传递。在这些文件中,您可以将其作为指针强制转换,并在对象上调用方法。

我还需要再做一步,将整个内容包装在MATLAB System对象或常规对象中,而不是将指针值S暴露在对象之外。你需要在对象上调用你的mex文件的方法。如果您计划将此内容提供给其他人使用,则尤其需要这样做。其他人可能会意外覆盖或修改导致崩溃的S.

最后你需要一个删除mex函数来删除指针S.如果你创建一个句柄类,那么你可以在析构函数中执行此操作。