matlab - 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 对象而不是派生类。
有没有实现这一目标的标准方法?
解决方案
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;
}
推荐阅读
- javascript - 当我添加数据对象'job'时,错误:vue.js:634 [Vue warn]: Property or method "job" is not defined on the instance
- html - QDomDocument:如何从 br 元素中获取文本?
- java - 在 JAVA 中将表情符号写入 XML 文件
- rest - 路由的 REST API 最佳实践
- r - ggplot2 将数据框的每一列与其他每一列进行对比
- javascript - 可以在 webcomponent 内部使用 vuejs 吗?
- javascript - 渲染将在 React 组件中实际运行多少次
- php - 如果列为空,则在 php 中回显出错
- ios - 跟踪用户喜欢的帖子 - flutter 和 firestore
- rundeck - 项目名称目录未在 rundeck 中创建