Мне было интересно, может ли кто-нибудь помочь мне понять синтаксис механизма Matlab в C. Я новичок в C и пытаюсь вызвать пользовательскую функцию Matlab в C с помощью Matlab Engine. Исследования, которые я провел, включают в себя чтение документации по API Matlab, просмотр видео лекций от Mathworks, исследование переполнения стека, чтение примера eng.c
файла в Matlab и Google.
Я придумал этот фрагмент кода, который компилируется, но на выходе возвращается ноль. Входной массив также возвращает не массив, а целое число. Я не могу найти подробное видео о том, как создать сценарий C, который
- принимает вектор
- передает его в функцию Matlab и
- возвращает вывод.
Документы очень четко объясняют создание массива, но я не могу найти информацию, которая подробно описывает чтение массива в Matlab, а затем получение вывода.
Ниже приведен код с комментариями о том, что, как я понимаю, делает каждый раздел кода. Пример функции add_up
просто вызывает функцию sum
для массива. Любая помощь была бы отличной, так как я застрял в том, почему это возвращает ноль.
#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;
}