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

时间:2015-02-05 18:57:46

标签: c++ matlab mex

我需要在mex函数中计算一些变量的哈希函数。特别是我需要处理一个24x1 geopoint向量的变量。为此,我需要检查它的类,因为可能有任何变量作为输入,所以我使用mxGetClassID计算它。但是,mxGetClassID返回值1437,这与mxClassID中的任何记录值不一致,也不是mxOBJECT_CLASS,这可能是合理的。我也试过mxIsObject,但它返回false。

我已经为数组,结构和单元格数组实现了哈希函数,它们都需要不同的处理,但我坚持使用类。那么如何检查给定变量是否为对象?

UPD:

如果我从max或mxGetClassName函数从MATLAB命令窗口为该变量运行class函数,它们都返回“geopoint”,但不知道它是否是对象。< / p>

功能代码如下:

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}

1 个答案:

答案 0 :(得分:2)

我终于想出了如何检查变量。出于某种原因,在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 ...
}