【问题标题】:MATLAB Mex C API Check if mxarray is base classMATLAB Mex C API 检查 mxarray 是否为基类
【发布时间】:2019-05-09 19:17:51
【问题描述】:

我们在 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 将数组视为类型 Class1,因此 mxIsClass(obj, 'BaseClass') 返回 false,因为它只考虑对象的类,而不考虑它派生自的类。

我正在尝试找出是否有办法解决这个问题,并确保 mex 函数中的 mxArray* 对象要么直接是 BaseClass,要么派生自它。

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

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

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


是否有实现此目标的标准方法?

【问题讨论】:

    标签: matlab class mex


    【解决方案1】:

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

    【讨论】:

    • 这可能是最好的解决方案,甚至可能是唯一的解决方案。 MEX 文件中的自定义类有点难,没有很好的接口来访问和操作它们。你最终只是为了任何事情而回电​​ MATLAB。但另一方面,自定义类是在 M 文件中定义的,所以无论它们提供什么样的接口,这一切都归结为以任何方式运行解释的 M 文件代码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-08
    • 1970-01-01
    • 2012-04-10
    • 2017-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多