matlab c共享库:使用mxArray * / mxArray捕获matlab函数输出**

时间:2015-08-03 06:04:11

标签: c++ c matlab shared-libraries

我试图从c代码调用matlab函数,试图遵循我可以通过网络得到的任何东西。我正在使用在Ubuntu 14.04上运行的matlab版本R2014a。让我们说函数testfun.m如下所示 -

function c = testfun(a, b)
    disp('doing testfun()');
    c = a + b ;
    disp('done testfun()');
end

现在我调用了mcc来制作c-wrapper -

user@pc:/tmp/test$ mcc -B csharedlib:libtestfun testfun.m -v

然后我有libtestfun.clibtestfun.hlibtestfun.so个文件,我创建了一个调用testfun()的c文件 -

#include <stdio.h>
#include "libtestfun.h"

int main()
{
    libtestfunInitialize();

    mxArray *a, *b, **c;
    double *x ;

    a = mxCreateDoubleScalar(4); x = mxGetPr(a);
    printf("a = %.1f\n", x[0]);
    b = mxCreateDoubleScalar(5); x = mxGetPr(b);
    printf("b = %.1f\n", x[0]);

    *c = mxCreateDoubleMatrix(1, 1, mxREAL);
    mlfTestfun(1, c, a, b);

    x = mxGetPr(c[0]);
    printf("c = %.1f\n", x[0]);

    libtestfunTerminate();
    return 1 ;
}

我正在使用 -

构建可执行文件
user@pc:/tmp/test$ mbuild test.c libtestfun.c -L.libtestfun.so -v

事实是该函数的签名为

LIB_libtestfun_C_API bool MW_CALL_CONV mlfTestfun(int nargout, mxArray** c, mxArray* a, mxArray* b);

如果您注意到,您可以看到输出c被声明为mxArray**,因此我在mxArray **c文件中使用test.c

但是当我运行可执行文件时,我只看到0.0作为c的值,但它应该是9.0 -

user@pc:/tmp/test$ ./test 
a = 4.0
b = 5.0
c = 0.0

发生了什么事?

为什么输出总是在函数签名中声明为mxArray**? 为什么我无法在disp()中看到testfun.m函数产生的输出?

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

您已正确声明state.getCities()。它也应该是c。签名中的双指针是因为它是输出。当您编写mxArray*时,您将取消引用未初始化的指针。

您需要以下代码:

*c