C returns零中的Matlab引擎函数

Matlab engine function in C returns zero

我想知道是否有人可以帮助我理解 C 中 Matlab 引擎的语法。我是 C 的初学者,我正在尝试使用 Matlab 引擎在 C 中调用自定义 Matlab 函数。我所做的研究包括阅读 Matlab 的文档 API、观看 Mathworks 的讲座视频、研究 Stack Overflow、阅读 Matlab 中的示例 eng.c 文件,以及 Google.

我想出了这段编译代码,但输出 return 为零。输入数组也不是 return 数组而是一个整数。我找不到有关如何构建

的 C 脚本的全面演练视频
  1. 接收向量
  2. 将其输入 Matlab 函数并
  3. returns输出。

文档对制作数组的解释非常清楚,但我找不到详细介绍将数组读入 Matlab,然后获取输出的信息。

下面,请查看代码,包括注释,了解我理解的每一段代码的作用。示例函数 add_up 只是调用数组上的 sum 函数。任何帮助都会很棒,因为我一直在想为什么这是 returning 零。

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "engine.h"
#define BUFSIZE 256

int main() {

    //Open call to matlab engine
    Engine *ep;

    //Use this conjunction with define BUFSIZe 256 to create double
    //extData is a variable to read external data
    //Number in brackets refer to size
    //We are using double in this case and create the external data using initialization
    double extData[10]={1.0,4.0,7.0,2.0,5.0,8.0,3.0,6.0,9.0,10.0};

    //Next step is to make a pointer of type mxArray 
    //These are pointers to an array of any size or type
    mxArray *pVarNum;
    double *outp;

    //After we make a matrix for the double data initialized above
    //Initialized to 0
    pVarNum=mxCreateDoubleMatrix(1,10,mxREAL);

    //Our array needs to be assigned a variable name for Matlab
    //Workspace
    //const char *myDouble = "T";

    //Our matlab matrix is initialized to zero. We need to use
    //The C memcpy function to get the data from extData to
    //Get the array data using the pointer to pVarNum
    //Use mxGetPr, a mxGet function
    memcpy((void *)(mxGetPr(pVarNum)), (void *)extData,sizeof(extData));

    //Place the variable T into the Matlab workspace
    engPutVariable(ep,"T",pVarNum);

    //Evalute test function
    engEvalString(ep, "out=T+1");

    //Make a pointer to the matlab variable
    outp=engGetVariable(ep,"out");
    //Now make a pointer to the C variable
    printf("%d\n",outp);

    printf("Done!\n");
    mxDestroyArray(pVarNum);

    engClose(ep);

    return EXIT_SUCCESS;

}

engGetVariable 函数 returns 一个 mxArray*,而不是 double*:

double *outp;
/* ... */
outp = engGetVariable(ep, "out");
printf("%d\n", outp);

这应该是:

mxArray *out;
double *outp;
int ii;
/* ... */
out = engGetVariable(ep, "out");
outp = mxGetPr(out);
for (ii = 0; ii < 9; ii++) {
   printf("%f, ", outp[ii]);
}
printf("%f\n", outp[9]);

另请注意,printf 中的 %d 格式化程序打印一个 int,您需要使用 %f 作为 double。

问题是 engputVariable 返回了 1,所以 Matlab 引擎没有接受数组。我最终从 Matlab engdemo.c 中复制并粘贴了最上面的代码段(直到 engPutVariable 的调用),然后继续我的代码。工作代码文件的编码是 ASCII。我认为关键部分是使用 Null 字符串打开 Matlab 的初始调用,尽管我将这段确切的代码放在了非工作脚本中并且它没有导致 engPutVariable 工作。

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "engine.h"
#define  BUFSIZE 256

int main()

{
    Engine *ep;
    mxArray *T = NULL, *outp = NULL;
    double *out;
    int ii;
    char buffer[BUFSIZE+1];
    double time[10] = { 0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0 };


    if (!(ep = engOpen(""))) {
        fprintf(stderr, "\nCan't start MATLAB engine\n");
        return EXIT_FAILURE;
    }

    T = mxCreateDoubleMatrix(1, 10, mxREAL);
    memcpy((void *)mxGetPr(T), (void *)time, sizeof(time));

    engPutVariable(ep, "T", T);


    //Evalute test function. This is new

    engEvalString(ep, "D=add_up(T);");

    //Make a pointer to the matlab variable
    if((outp=engGetVariable(ep,"D"))==NULL){
        printf("Oops!");
    }
    out= mxGetPr(outp);

    //Now make a pointer to the C variable
    for (ii=0; ii<10; ii++) {
        printf("%f\n", out[ii]);
    }
    printf("%f\n",out[2]);

    printf("Done!\n");
    mxDestroyArray(T);
    mxDestroyArray(outp);
    engClose(ep);

    return EXIT_SUCCESS;

}