MATLAB Mex C API检查mxarray是否为基类

时间:2019-05-09 19:17:51

标签: matlab class mex

我们正在使用MATLAB中的类,这些类已传递给某些C Mex函数。以前,我们一直传递的类对象都是相同的类型,因此我们已经能够使用mxIsClass来验证对象是正确的类型。

但是,我们已经更改了体系结构,以使对象现在可以从原始基类派生出来以允许自定义。实际上,我们有类似的东西:

handle & mixin.Heterogeneous>
    BaseClass >
        Class1
        Class2

由于基类使用mixin。异构,如果我传递类似[Class1_obj Class2_obj]的数组,则mex函数将按预期工作-MATLAB将数组视为BaseClass和{{1 }}返回true。

问题出现了,当我们将单个对象或相同派生类(例如mxIsClass(obj, 'BaseClass'))的数组传递给mex函数时。因为它们是同一类型,所以MATLAB将数组视为类型[Class1_obj1 Class1_obj2],因此Class1返回false,因为它仅考虑对象的类而不考虑对象的类。

我正在尝试找出是否有办法解决此问题,并确保mex函数中的mxIsClass(obj, 'BaseClass')对象是直接的mxArray*还是从中派生的。

我已经考虑过简单地为每个已知的派生类名称添加检查,但这似乎是一种丑陋的方式,尤其是因为如果我们添加更多的派生类,则每次都需要更改mex函数。

我想我可以使用BaseClass函数在MATLAB中调用mexCallMATLAB,它应该正确地识别它是基类。

我也想知道是否有一种方法可以使MATLAB将对象传递给Mex函数,将其视为BaseClass对象而不是派生类。


有没有达到此目的的标准方法?

1 个答案:

答案 0 :(得分:3)

TL; DR; 现在,我将简单地调用MATLAB来检查类。

仅因为我确信必须有更好的方法,所以我不会将此标记为答案。


MATLAB的内置isa函数可用于确定对象或对象数组是否为正确的类型。 MATLAB函数的确查看基本类,因此isa(Class1_obj,'BaseClass')确实返回true。

目前,我已经在mex文件中实现了一个函数,该函数仅调用MATLAB自己的isa函数来检查类型。作为有类似问题的任何人的参考,以下是我为此任务编写的C函数。

    //Check the type of class object or object array using MATLAB
    static bool isa(mxArray* obj, const char* type) {
        //Create LHS/RHS arrays for calling MATLAB
        mxArray *lhs[1];
        mxArray *rhs[2];
        //Return value
        bool retVal;
        //Populate Inputs to MATLAB isa
        rhs[0] = obj;
        rhs[1] = mxCreateString(type);
        //Call the MATLAB isa function
        mexCallMATLAB(1, lhs, 2, rhs, "isa");
        //Extract result
        retVal = mxIsLogicalScalarTrue(lhs[0]);
        //Cleanup
        mxDestroyArray(rhs[1]);
        mxDestroyArray(lhs[0]);
        //Done
        return retVal;
    }