我正在尝试从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.c libtestfun.h libtestfun.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 = %.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函数产生的输出?

任何帮助将不胜感激。

最佳答案

您错误地声明了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 = %.1f\n", x[0]);
    b = mxCreateDoubleScalar(5); x = mxGetPr(b);
    printf("b = %.1f\n", x[0]);

    if (mlfTestfun(1, &c, a, b))
    {
        x = mxGetPr(c);
        printf("c = %.1f\n", x[0]);
    }

    libtestfunTerminate();
    return 1 ;
}

关于c++ - matlab c共享库:使用mxArray */mxArray **捕获matlab函数输出,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31780380/

10-12 18:37