如何检查mxArray是否具有类类型
How can I check if mxArray has class type?
我需要计算mex函数中一些变量的哈希函数。特别是我需要处理一个变量,它是24x1地球点矢量。要做到这一点,我需要检查它的类,因为可能有任何变量作为输入,所以我使用mxGetClassID
来计算它。然而,mxGetClassID
返回值1437,这与mxClassID中的任何记录值都不对应,也不是mxOBJECT_CLASS
,这可能是合理的。我也尝试过mxIsObject
,但它返回false。
我已经为数组、结构和单元数组实现了散列函数,它们都需要不同的处理,但我一直使用类。那么,我如何检查给定的变量是否是一个对象呢?
UPD:
如果我为该变量运行来自mex的mxGetClassName
函数或来自MATLAB命令窗口的class
函数,它们都会返回"geopoint",但不知道它是否是对象。
功能代码如下:
void appendMxArrayHash(const mxArray* array, uint64& hash) {
mxClassID classID = mxGetClassID(array);
char buf[100];
sprintf(buf, "classID '%d' in appendMxArrayHash", classID);
mexWarnMsgIdAndTxt("MATLAB:NotImplemented", buf);
appendHash(classID, hash);
switch (classID) {
case mxINT8_CLASS:
case mxUINT8_CLASS:
case mxINT16_CLASS:
case mxUINT16_CLASS:
case mxINT32_CLASS:
case mxUINT32_CLASS:
case mxINT64_CLASS:
case mxUINT64_CLASS:
case mxSINGLE_CLASS:
case mxDOUBLE_CLASS:
case mxCHAR_CLASS:
{
int n = mxGetN(array);
int m = mxGetM(array);
void* data = mxGetData(array);
int elementSize = mxGetElementSize(array);
appendHash(n, hash);
appendHash(m, hash);
appendHash(n * m * elementSize, (char*)data, hash);
break;
}
case mxCELL_CLASS:
{
int n = mxGetN(array);
int m = mxGetM(array);
appendHash(n, hash);
appendHash(m, hash);
for (int i = 0; i < n * m; i++) {
mxArray* cell = mxGetCell(array, i);
appendMxArrayHash(cell, hash);
}
break;
}
case mxSTRUCT_CLASS:
{
int n = mxGetN(array);
int m = mxGetM(array);
int nFields = mxGetNumberOfFields(array);
appendHash(n, hash);
appendHash(m, hash);
for (int i = 0; i < nFields; i++) {
const char* name = mxGetFieldNameByNumber(array, i);
int nameLength = strlen(name);
appendHash(nameLength, hash);
appendHash(nameLength, name, hash);
for (int j = 0; j < n * m; j++) {
mxArray* field = mxGetFieldByNumber(array, j, i);
if (field)
appendMxArrayHash(field, hash);
else {
appendHash(0, hash);
}
}
}
break;
}
default:
{
char buf[100];
sprintf(buf, "Unsupported classID '%d' in appendMxArrayHash", classID);
mexWarnMsgIdAndTxt("MATLAB:NotImplemented", buf);
}
}
}
UPD2:
这就是array
变量的样子:
trackSegment =
24x1 geopoint vector with properties:
Collection properties:
Geometry: 'point'
Metadata: [1x1 struct]
Feature properties:
Latitude: [1x24 double]
Longitude: [1x24 double]
Elevation: [1x24 double]
Time: {1x24 cell}
我终于找到了如何检查变量。出于某种原因,在mex中没有isobject
的替代方案。mxIsClass
不适合,因为它需要类名,这是未知的,正如评论中提到的那样。所以我只是用mexCallMATLAB
来调用isobject
。
该代码相当丑陋,也不是最有效的,但它可以工作:
mxArray* isobjectResult = mxCreateNumericMatrix(1, 1, mxLOGICAL_CLASS, mxREAL);
mexCallMATLAB(1, &isobjectResult, 1, const_cast<mxArray**>(&array), "isobject");
if (mxIsLogicalScalarTrue(isobjectResult)) {
// process array ...
}
相关文章:
- 是否可以初始化不可复制类型的成员变量(或基类)
- 是否可以从int转换为enum类类型
- 检查 std::shared_ptr<> 的当前底层类型是否为 T
- 函数作为模板参数,是否对返回类型强制约束
- JS相等运算符(如===)是否可以使用embind类型
- visual是否可以在c++中创建一个接收无限数量相同类型(或至少相当数量)参数的函数
- 检查函数返回类型是否与STL容器类型值相同
- 在类型和包装器之间reinterpret_cast是否安全<Type>?
- 检查某些类型是否是模板类 std::optional 的实例化
- 是否有内置方法可以强制转换为不同的基础类型,但保留常量限定符?
- C++类型特征,以查看是否可以<uint32_t>对类型"K"的任何变量调用"static_cast(k)"
- boost 是否有按特殊类型值编码状态"compact optional"?
- 初始值设定项列表是否只接受使用相同类型的值初始化变量?
- 是否有任何建议来统一函数类型限定符并简化可恶的函数类型?
- 表达式 SFINAE:如何根据类型是否包含具有一个或多个参数的函数来选择模板版本
- 检查一个类型是否直接派生自"enable if"上下文中的另一个类型(是其子类型)
- 在运行时检查继承是否只有一种类型和 void*
- 给定一个C++嵌套的私有结构类型,是否有从文件范围静态函数访问它的策略
- 将类型声明为类型模板参数的模板参数的一部分是否合法?
- 当返回类型声明为 ListNode 时,我们是否可以返回 false<T>*