matlab c共享库:用mxArray*/mxArray**捕获matlab函数输出
matlab c shared library: capturing matlab function output with mxArray*/mxArray**
我正试图从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.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 = %.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.m
中disp()
函数产生的输出?
您错误地声明了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 ;
}
相关文章:
- 在C++STL中是否有Polyval(Matlab函数)等价物?
- 有可能在Armadillo中复制MATLAB circshift方法吗
- 使用 MATLAB 编码器生成C++代码:编译错误"undefined reference to `rgb2gray_tbb_real64'"
- vector<vector<double>> to mxArray using memcpy
- MATLAB to C++: csvread() not supported by MATLAB Coder
- 加载由 MATLAB Coder 生成的带有函数的 DLL,该函数调用外部函数
- MATLAB:跟踪imufilter对象中的状态变化
- 如何将 c++ 中的客户端 TCP 的替身列表发送到 Matlab 中的 TCP 服务器?
- 将三角函数的正确值与matlab进行比较
- 连接 MATLAB 和 Visual Studios 的问题
- 如何将C++连接到 Matlab
- 如何发送 Mat H=findHomography 返回 Matlab
- 如何在C++中编写 MATLAB fix(X) 函数?
- 提供变量作为 MATLAB 系统命令的输入参数,以便C++可执行文件
- 有没有更好的方法可以使用特征/C++实现 matlab 的逻辑索引?
- 当我运行MEX文件时,MATLAB崩溃
- 在带有单元格数组的C 特征矩阵和MATLAB MXARRAY之间传递数据
- 使用 Matlab Coder 将 Matlab m 文件转换为 C/C++ 代码,包括 mex 文件 (mxArray
- 将多维C数组复制到Matlab中的mxArray类型
- matlab c共享库:用mxArray*/mxArray**捕获matlab函数输出