如何检查mxArray是否具有类类型

How can I check if mxArray has class type?

本文关键字:是否 类型 mxArray 何检查 检查      更新时间:2023-10-16

我需要计算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 ...
}
相关文章: