gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 02:24:12 24 4
gpt4 key购买 nike

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

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

更新:

如果我从 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 ...
}

关于c++ - 如何检查 mxArray 是否具有类类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28351879/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com