- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我需要在 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/
我正在尝试从 C 代码调用 matlab 函数,尝试遵循我可以通过网络获得的任何信息。我正在使用在 Ubuntu 14.04 上运行的 matlab 版本 R2014a。假设函数 testfun.m
我正在尝试使用函数 mexCallMATLAB 作为 described here . 但是,我总共有 4 个输入参数,因此我通过这样做创建了一个 mxArray mxArray *funcInput
我遇到了一些指针困惑: 我有一些(数值配方)C 函数 fitexy(in, &out),我想将其编译为 .mex 文件以从 matlab 调用它。但是,我无法让网关例程访问out的指针,以便将其传递给
我喜欢使用 mexEvalString 因为它很容易在 mex 中执行。但是,我得到了一些命令的异常,所以我想使用 mexEvalStringWithTrap 捕获它们以查看发生了什么,但我无法从异常
我需要在 mex 函数中计算一些变量的散列函数。特别是我需要处理一个 24x1 geopoint 的变量 vector 。为此,我需要检查它的类,因为可能有任何变量作为输入,所以我使用 mxGetCl
好吧,伙计们,我感觉自己好像掉进了兔子洞...... 为了构建一个作为 Matlab-Mex 的接口(interface)来接收由复杂的 C 结构组成的多个不同消息,我想在不同的函数中创建相应的 Me
这就是我要实现的目标: MATFile *file = matOpen(this->filename.c_str(),"r"); mxArray *roadstruct = matGetVariabl
我正在为 Matlab 处理一个巨大的矩阵(超过 20.000x20.000 double )的文件。我想在完成计算后,将作为本征矩阵处理的结果矩阵映射到 mxArray,而无需内存复制和在内存上分配
我有 MATLAB mex 代码,可以侵入 mxArray header 以读取和修改诸如 CrossLink 指针(用于共享数据副本)等字段。这对于允许我在 mex 例程中处理非常大的变量而无需创建
我尝试使用 VS 2010 MATLAB 2012b MEX 代码段并收到此错误 c:\users\krzysztof\desktop\libocas_v096\libocas_v096\sparse
我经常通过在 mex 中实现来优化一些 matlab 例程。到目前为止这工作正常 - 但每当创建返回 mxArray 时,它都会在我使用 mxCreateNumericArray 构建它时进行预初始化
我想在 C++ 代码中使用“engine.h”将矩阵发送到 Matlab。事实上,我在 cv::Mat 中有数据,我需要发送一个 mxArray。我尝试使用这个表达式,但它不起作用: cv::Mat
我使用 mex 在 matlab 中得到了一个典型的 cpp 函数 #include "mex.h" void func (int * rowvec, int * colvec, float * va
我正在为 Matlab 编写一个 mex 函数,并在编译期间注意到来自 Visual Studio 2017 的警告。在几乎删除除包含的所有内容和 mex 函数的裸包装器之后,我不得不得出结论,警告实
我正在尝试使用 mex.h将我编写的 c++ 程序转换为 Matlab 命令的 header ,但我不明白它们的 mxArray 结构是如何工作的。 假设我有一个 std::vector称为 data
我们一直在与从 Matlab 编译器创建的库进行交互。我们的问题与从库返回的数组有关。 一旦我们完成数组,我们想释放内存,但是,这样做偶尔会导致段错误。 这是 Matlab 库 (bugtest.m)
我想在 Eigen 矩阵/vector 和 mex 数组之间传递数据。在下面的代码中,我定义了一个名为 y_output 的 mex 数组,其中包含一个元胞数组。变量 y_output 将传递给 MA
我正在编写打开 Matlab API 引擎的 C++ 代码。在演示文件 Matlab_ROOT/extern/examples/eng_mat/engdemo.cpp 中,它展示了如何将简单的一维 c
我有一个数据的相关矩阵,我想使用 pca 将它们转换为不相关的集合。 所以我决定使用 matlab 引擎(c++ mex API)来执行 pca 我的问题是如何有效地将矩阵内容复制到 mxArray我
我有以下 C++ vector : std::vector myVec; 其中 myStruct 包含: struct myStruct { Point3D start; Point3D en
我是一名优秀的程序员,十分优秀!