为啥这段代码没有调用 Matlab 函数

Posted

技术标签:

【中文标题】为啥这段代码没有调用 Matlab 函数【英文标题】:why this code is not calling Matlab function为什么这段代码没有调用 Matlab 函数 【发布时间】:2014-01-06 23:29:22 【问题描述】:

我在 MATLAB 中编写了一个代码来添加两个数字。代码如下:

function [z] = addition(x,y)
    z=x+y;
end

我用 C 语言编写了另一个代码来调用这个加法函数。代码如下:

#include "mex.h"

void  mexFunction (int nlhs, mxArray* plhs[],
      int nrhs, const mxArray* prhs[])

    mxArray *a,*b,*c;
    a=mxCreateDoubleMatrix(1, 1, mxREAL);
    b=mxCreateDoubleMatrix(1, 1, mxREAL);
    a=1;
    b=1;
    mexCallMATLAB(1,&c, 2, &b, &a, "addition");
    mexCallMATLAB(0,NULL,1, &c, "disp");
    mxDestroyArray(a);
    mxDestroyArray(b);

    return;

请告诉我为什么它不起作用??? 谢谢

【问题讨论】:

错误信息是什么? 你的代码有这行'mexCallMATLAB(1,&c, 2, &b, &a, "addition");'。 mexCallMATLAB 应该有一个输入指针数组,而不是 2 个单独的输入指针。 是的,并且您必须先获取指向 mxArray (mxGetPr/mxGetData) 的数据的指针,然后才能为其赋值。由于您正在处理标量,因此您可以像下面那样使用 mxCreateDoubleScalar 【参考方案1】:

代码有几个问题:

为 mxArray 的 ab 赋值的方式不正确。 将输入传递给 mexCallMATLAB 的方式也不正确

这是我的实现:

callAdd.c

#include "mex.h"

void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])

    mxArray *in[2], *out[1];

    in[0] = mxCreateDoubleScalar(5);
    in[1] = mxCreateDoubleScalar(4);

    mexCallMATLAB(1, out, 2, in, "addition");
    mexCallMATLAB(0, NULL, 1, out, "disp");

    mxDestroyArray(in[0]);
    mxDestroyArray(in[1]);
    mxDestroyArray(out[0]);

这基本上相当于在MATLAB中调用disp(addition(5,4))

【讨论】:

你解决了我的问题,谢谢。我只想知道关于 mxArray 的另一件事。 mxArray 用于输入和输出参数。为什么我们不使用mxArray *in[1],*in[0], *out[0]; MATLAB 使用不透明类型mxArray 表示所有变量(包括标量、向量、矩阵、结构、元胞数组等)。在上面的代码中,in 被定义为两个mxArray 指针的数组。如果您阅读有关指针和数组的 C 教程,也许会有所帮助。

以上是关于为啥这段代码没有调用 Matlab 函数的主要内容,如果未能解决你的问题,请参考以下文章

为啥这段代码(在 Matlab 的 MEX 文件中使用 OpenMP)给出不同的结果?

matlab中的函数句柄

为啥这段代码调用自动释放池?

了解汇编、nasm、x86 中的 printf 函数。我不知道为啥这段代码没有打印出任何东西

为啥我的路由在调用破坏函数后会失败?

为啥这段代码没有抛出未定义的属性 PHP 通知?