【问题标题】:return array from c++ dll to matlab [duplicate]从c ++ dll返回数组到matlab [重复]
【发布时间】:2013-09-01 14:29:17
【问题描述】:

我正在尝试在 C++ 中构建一个 DLL,并使用 loadlibrarycalllib 指令从 MATLAB 中调用它。它适用于一个值并正常返回一个值,但现在我试图将整个数组从 C++ DLL 返回到 MATLAB 作为函数的输出。

如您所知,C++ 通常将数组作为指针返回,但这不适用于 MATLAB ... 我在互联网上搜索过,他们正在使用一些 MEX 功能,但不清楚...

您能解释一下如何将数组从 C++ DLL 返回到 MATLAB calllib 以及我们应该如何从 C++ 代码中返回它?

【问题讨论】:

  • 我觉得不一样或者没看懂……
  • 感谢您的回复 我试图返回一个指向 double 但没有工作的指针,请写一行代码,以便我了解该函数应该如何工作......而且我从 dll 库调用这个函数不是直接来自墨西哥....
  • @EitanT:我认为 OP 正在尝试使用 loadlibrary,而不是编写 MEX 函数。尽管这也是与 C/C++ 集成的可行选择
  • @Amro Ah,然后收回我的 cmets。

标签: c++ arrays matlab dll loadlibrary


【解决方案1】:

考虑一个公开以下 C 函数的 DLL:

void getData(double *x, const int len)
{
    for(int i=0; i<len; i++) {
        x[i] = i;
    }
}

它需要一个已经分配了它的长度的数组,并用增量值填充它。

在 MATLAB 中,首先我们load the library:

>> loadlibrary('mydll.dll', 'mydll.h')
>> libfunctions mydll -full

Functions in library mydll:

doublePtr getData(doublePtr, int32)

要调用暴露的函数,我们使用libpointer:

>> p = libpointer('doublePtr', zeros(1,10))  % initialize array of 10 elements
p =
libpointer
>> get(p)
       Value: [0 0 0 0 0 0 0 0 0 0]
    DataType: 'doublePtr'
>> calllib('mydll', 'getData', p, 10)        % call C function
>> get(p)
       Value: [0 1 2 3 4 5 6 7 8 9]
    DataType: 'doublePtr'

我们也可以简单地传递正则向量,然后 MATLAB 将负责编组:

>> x = calllib('mydll', 'getData', zeros(1,10), 10)
x =
     0     1     2     3     4     5     6     7     8     9

请注意,在this case 中,修改后的数组将作为输出返回(因为不会就地修改内置类型)。

【讨论】:

  • 您也可以编写函数,以便它自己分配内存。有关示例,请参见 here(适用于字符串,但概念相似)。此外,作为替代方案,您可以编写一个包装 C/C++ DLL 的 MEX 函数,而不是使用 loadlibrary 方法
  • 非常感谢...我可以将它应用于 2d-Array 吗? (其实我是c程序员,对matlab不太了解……但这是工作:)……)
  • @user130227:这很容易尝试,尝试将上面的调用称为:x = calllib('mydll', 'getData', zeros(2,5), 10)... 所以它适用于任何维数组,请记住 MATLAB 使用column-major order。即使不是这样,您也可以始终传递平面一维数组,然后 reshape 将 MATLAB 中的结果作为二维矩阵传递
猜你喜欢
  • 2012-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-28
  • 2012-02-03
  • 1970-01-01
相关资源
最近更新 更多