我需要在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}
答案 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 ...
}