【问题标题】:MATLAB array of libpointerMATLAB 的 libpointer 数组
【发布时间】:2014-08-19 13:57:52
【问题描述】:

我目前正在为 C++ 库开发一个包装器,以便它可以在 MATLAB 中使用。我希望我的 C++ 对象在 MATLAB 中,以便用户可以对它们做一些事情。实际上,我将这些 C++ 对象转换为 void *,因为 MATLAB 仅支持 C 头文件。这些 C 函数如下所示:

__declspec(dllexport) void *getPtr (int someArgument);

在 MATLAB 中,我这样调用函数:

ptr = calllib('LibName', 'getPtr', 42);

在 MATLAB 中,ptr 现在是 <1x1 lib.pointer>。除了将它传递给另一个 C 函数之外,我什么也做不了,如下所示:

__declspec(dllexport) int doSomethingWithPtr (void *ptr);

所以我在 MATLAB 中调用 result = calllib('LibName', 'doSomethingWithPtr', ptr);,它工作得非常好,并以指针作为参数来执行这个函数。 (我调试过C代码,指针和getPtr返回的指针一样。

我的 C 函数需要多个指针才能按照 C++ 库的预期工作。我已经将 MATLAB 矩阵中的数值数据传递给 C,它与 C 类型 mxArray 完美配合(参见:http://www.mathworks.de/de/help/matlab/apiref/mxarray.html)。为了将多个指针传递给 C,我构造了一个 MATLAB lib.pointers 数组,如下所示:

A = [];

for i = 1:10
    ptr = calllib('LibName', 'getPtr', i);
    A = [A, ptr];    
end

我正在 MATLAB 中调用另一个 C 函数 (__declspec(dllexport) int doSomethingWithPtrArray (mxArray *ptrarr);):

ptr = calllib('LibName', 'doSomethingWithPtrArray', A);

在 C 函数中,我使用 mxGetN(ptrarr)mxGetM(ptrarr) 获得了正确的数组维度。我还可以通过以下方式检索数据指针:

void *mexPtr = mxGetData(ptrarr);

问题是mexPtr 和下面的指针指向我以前什至没有分配或知道的内存中的位置。也许 MATLAB 在使用 void * 调用函数时会进行一些智能包装,而在我传递数组时不会这样做。 (我想我正在获取 MATLAB lib.pointer 包装器对象的地址??)

是否有人知道如何从 mxArray 中获取正确的指针(或解决方法),以便我可以一次评估多个指针?

【问题讨论】:

    标签: c++ c arrays matlab


    【解决方案1】:

    由于我没有找到“漂亮”的解决方案,我在 C++ 中构建了一个辅助方法,它让我可以构建自己的向量:

    void *buildClassifierVectorBase(void *vector, void *classifier)
    {
        typedef IClassifierManager<input_dtype, feature_dtype, annotation_dtype> class_man_t;
    
        std::vector<std::shared_ptr<class_man_t>> *classMgrs;
    
        if (vector == nullptr)
        {
            classMgrs = new std::vector<std::shared_ptr<class_man_t>>();            
        } 
        else
        {
            classMgrs = static_cast<std::vector<std::shared_ptr<class_man_t>> *>(vector);
        }
    
        class_man_t *cls = static_cast<class_man_t *>(classifier);
        classMgrs->push_back(std::shared_ptr<class_man_t>(cls));        
    
        return static_cast<void *>(classMgrs);  
    }
    

    我可以在 MATLAB 中使用这种方法来构建指针向量,如下所示:

    ptr1 = calllib('LibName', 'getPtr', 42);
    ptr2 = calllib('LibName', 'getPtr', 43);
    ptr3 = calllib('LibName', 'getPtr', 44);
    
    vector = calllib('LibName', 'buildClassifierVectorBase', libpointer, ptr1);
    vector = calllib('LibName', 'buildClassifierVectorBase', vector, ptr2);
    vector = calllib('LibName', 'buildClassifierVectorBase', vector, ptr3);
    

    现在我可以调用我的方法doSomethingWithPtrArray

    ptr = calllib('LibName', 'doSomethingWithPtrArray', vector);
    

    此解决方案有效,但不是最漂亮的...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-10-24
      • 1970-01-01
      • 2010-09-21
      • 2012-11-05
      • 2023-03-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多