首页 > 解决方案 > MATLAB Mex C API 检查 mxarray 是否为基类

问题描述

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

然而,我们改变了架构,使得对象现在从原始基类派生以允许定制。实际上,我们有类似的东西:

handle & mixin.Heterogeneous>
    BaseClass >
        Class1
        Class2

因为基类使用 mixin.Heterogeneous,如果我传递一个类似的数组[Class1_obj Class2_obj],mex 函数会按预期工作 - MATLAB 将数组视为类型数组BaseClass,并mxIsClass(obj, 'BaseClass')返回 true。

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

我试图弄清楚是否有办法解决这个问题,并确保mxArray*mex 函数中的对象是BaseClass直接的,或者派生自它。

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

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

我还想知道是否有办法让 MATLAB 将对象传递给 Mex 函数,将其视为 BaseClass 对象而不是派生类。


有没有实现这一目标的标准方法?

标签: matlabclassmex

解决方案


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;
    }

推荐阅读