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 脚本的全面演练视频
- 接收向量
- 将其输入 Matlab 函数并
- 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;
}
我想知道是否有人可以帮助我理解 C 中 Matlab 引擎的语法。我是 C 的初学者,我正在尝试使用 Matlab 引擎在 C 中调用自定义 Matlab 函数。我所做的研究包括阅读 Matlab 的文档 API、观看 Mathworks 的讲座视频、研究 Stack Overflow、阅读 Matlab 中的示例 eng.c
文件,以及 Google.
我想出了这段编译代码,但输出 return 为零。输入数组也不是 return 数组而是一个整数。我找不到有关如何构建
的 C 脚本的全面演练视频- 接收向量
- 将其输入 Matlab 函数并
- 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;
}