我正在尝试从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/