MATLAB Mex C API 检查 mxarray 是否为基 class
MATLAB Mex C API Check if mxarray is base class
我们在 MATLAB 中使用 classes,它们被传递到一些 C Mex 函数中。以前我们传递的 class 个对象都是同一类型,所以我们已经能够使用 mxIsClass
来验证对象是正确的类型。
但是,我们更改了体系结构,使对象现在从原始基础派生 class 以允许自定义。实际上我们有这样的东西:
handle & mixin.Heterogeneous>
BaseClass >
Class1
Class2
因为基础 class 使用 mixin.Heterogeneous,如果我传递像 [Class1_obj Class2_obj]
这样的数组,mex 函数将按预期工作 - MATLAB 将数组视为 [= 类型的数组15=],并且 mxIsClass(obj, 'BaseClass')
returns 正确。
当我们将单个对象或相同派生的数组 class,比如 [Class1_obj1 Class1_obj2]
传递给 mex 函数时,问题就出现了。因为它们是相同的类型,MATLAB 将数组视为类型 Class1
,因此 mxIsClass(obj, 'BaseClass')
returns false 因为它只考虑对象的 class 而不是 classes 它派生自。
我想弄清楚是否有办法解决这个问题并确保 mex 函数中的 mxArray*
对象直接是 BaseClass
,或者派生自它。
我考虑过简单地为每个已知派生 class 名称添加检查,但这似乎是一种丑陋的方式,尤其是因为如果我们添加更多派生 classes 我们需要每次都更改 mex 函数。
我想我可以使用 mexCallMATLAB
函数在 MATLAB 中调用 isa
,它应该正确识别它是一个基础 class.
我还想知道是否有办法让 MATLAB 将对象传递给 Mex 函数,将其视为 BaseClass 对象而不是派生对象 class。
有实现此目标的标准方法吗?
MATLAB 的内置 isa
函数可用于查明对象或对象数组的类型是否正确。 MATLAB 函数确实会查看基类,因此 isa(Class1_obj,'BaseClass')
会 return 为真。
我在 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;
}
我们在 MATLAB 中使用 classes,它们被传递到一些 C Mex 函数中。以前我们传递的 class 个对象都是同一类型,所以我们已经能够使用 mxIsClass
来验证对象是正确的类型。
但是,我们更改了体系结构,使对象现在从原始基础派生 class 以允许自定义。实际上我们有这样的东西:
handle & mixin.Heterogeneous>
BaseClass >
Class1
Class2
因为基础 class 使用 mixin.Heterogeneous,如果我传递像 [Class1_obj Class2_obj]
这样的数组,mex 函数将按预期工作 - MATLAB 将数组视为 [= 类型的数组15=],并且 mxIsClass(obj, 'BaseClass')
returns 正确。
当我们将单个对象或相同派生的数组 class,比如 [Class1_obj1 Class1_obj2]
传递给 mex 函数时,问题就出现了。因为它们是相同的类型,MATLAB 将数组视为类型 Class1
,因此 mxIsClass(obj, 'BaseClass')
returns false 因为它只考虑对象的 class 而不是 classes 它派生自。
我想弄清楚是否有办法解决这个问题并确保 mex 函数中的 mxArray*
对象直接是 BaseClass
,或者派生自它。
我考虑过简单地为每个已知派生 class 名称添加检查,但这似乎是一种丑陋的方式,尤其是因为如果我们添加更多派生 classes 我们需要每次都更改 mex 函数。
我想我可以使用 mexCallMATLAB
函数在 MATLAB 中调用 isa
,它应该正确识别它是一个基础 class.
我还想知道是否有办法让 MATLAB 将对象传递给 Mex 函数,将其视为 BaseClass 对象而不是派生对象 class。
有实现此目标的标准方法吗?
MATLAB 的内置 isa
函数可用于查明对象或对象数组的类型是否正确。 MATLAB 函数确实会查看基类,因此 isa(Class1_obj,'BaseClass')
会 return 为真。
我在 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;
}