Использование Matlab "engine.h" из C ++ правильно - PullRequest
2 голосов
/ 12 января 2012

У меня есть код, который обрабатывает кадры в каждой итерации и генерирует матрицу.Моя конечная цель - отправить данные матрицы в Matlab, чтобы изучить эволюцию матрицы с каждым кадром.Для этого я определил статическую переменную Engine в файле заголовка (helper.h).

#include "engine.h";
#include "mex.h";
static Engine *engine;

В программе main () я открываю движок только один раз:

#include helper.h   


main(){
if (!(engine = engOpen(NULL))) {
    MessageBox ((HWND)NULL, (LPSTR)"Can't start MATLAB engine",(LPSTR) "pcTest.cpp", MB_OK);
    exit(-1);}

//here comes frame processing using a while loop
.
.  //a function is called (defined in matrix.cpp)
.
//frame processing ends
}

А внутри matrix.cpp я получаю матрицу, которую хочу отправить в Matlab Engine, поэтому я делаю что-то вроде этого:

#include helper.h

mxArray *mat;   
mat = mxCreateDoubleMatrix(13, 13, mxREAL);     
memcpy(mxGetPr(mat),matrix.data, 13*13*sizeof(double));
engPutVariable(engine, "mat", mat);

Я хочу использовать указатель на engine наиболее эффективным способом.Я немного озадачен тем, как правильно использовать движок matlab.

Любая помощь приветствовалась бы, потому что документация и примеры matlab не помогли вообще, так как они содержат весь код в одном файле и не работают.Не использую итерации.Заранее спасибо.

РЕДАКТИРОВАТЬ

Первая проблема решена с указателем двигателя.Решение объявляет его как внешний.

#include "engine.h";
#include "mex.h";
extern Engine *engine;

и в main.cpp

#include helper.h   
Engine *engine=NULL;

main(){}

1 Ответ

4 голосов
/ 12 января 2012

static означает «локально для текущей единицы компиляции».Единицей компиляции обычно является один .cpp файл, поэтому в вашей программе есть две переменные engine, одна в main.o и одна в matrix.o.Вам необходимо объявить engine как extern в заголовочном файле и определить его без какого-либо модификатора ровно в одном .cpp файле.

helper.h:

extern Engine* engine;

main.cpp:

#include "helper.h"
Engine* engine = NULL;
...