我们正在使用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对象而不是派生类。
有没有达到此目的的标准方法?
答案 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;
}