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

matlab c shared library: capturing matlab function output with mxArray*/mxArray**

本文关键字:matlab mxArray 捕获 输出 函数 共享      更新时间:2023-10-16

我正试图从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包装器——

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

然后我有libtestfun.c, libtestfun.hlibtestfun.so文件,我创建了一个c文件,像这样调用testfun()——

#include <stdio.h>
#include "libtestfun.h"
int main()
{
    libtestfunInitialize();
    mxArray *a, *b, **c;
    double *x ;
    a = mxCreateDoubleScalar(4); x = mxGetPr(a);
    printf("a = %.1fn", x[0]);
    b = mxCreateDoubleScalar(5); x = mxGetPr(b);
    printf("b = %.1fn", x[0]);
    *c = mxCreateDoubleMatrix(1, 1, mxREAL);
    mlfTestfun(1, c, a, b);
    x = mxGetPr(c[0]);
    printf("c = %.1fn", 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**,因此我在test.c文件中使用mxArray **c

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

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

怎么回事?

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

您错误地声明了c。它也应该是mxArray*。签名中的双指针是因为它是一个输出。当你写*c时,你是在取消引用一个未初始化的指针。

您需要以下代码:

#include <stdio.h>
#include "libtestfun.h"
int main()
{
    libtestfunInitialize();
    mxArray *a;
    mxArray *b;
    mxArray *c = NULL; // output arg must be initialized to NULL
    double *x ;
    a = mxCreateDoubleScalar(4); x = mxGetPr(a);
    printf("a = %.1fn", x[0]);
    b = mxCreateDoubleScalar(5); x = mxGetPr(b);
    printf("b = %.1fn", x[0]);
    if (mlfTestfun(1, &c, a, b))
    {    
        x = mxGetPr(c);
        printf("c = %.1fn", x[0]);
    }
    libtestfunTerminate();
    return 1 ;
}