2015-07-30 2 views
0

Я пытаюсь передать переменную z = 100 из C++ в Matlab для дальнейшей обработки (это очень упрощенный пример). Я в основном хочу, чтобы это было передано как глобальная переменная, так что я могу получить доступ к этой переменной из любой функции Matlab (возможно, отправлен в рабочую область Matlab).Передача переменной из C++ в Matlab (Workspace)

Вот мой C++ код (я использую двигатель Matlab изнутри C++):

#include "opencv2/highgui/highgui.hpp" 
#include "opencv2/opencv.hpp" 
#include <iostream> 
#include <math.h> 
#include <fstream> 
#include <stdio.h> 
#include <Windows.h> 
#include "engine.h" 
#include <engine.h> 
//#include <cmath> 
#define _USE_MATH_DEFINES 

#pragma comment (lib, "libmat.lib") 
#pragma comment (lib, "libmx.lib") 
#pragma comment (lib, "libmex.lib") 
#pragma comment (lib, "libeng.lib") 

using namespace cv; 
using namespace std; 

int main (int argc, char* argv[]) 
{ 
    Engine *ep = engOpen(NULL); 
    int z; 
    mxArray *z_array = mxCreateDoubleMatrix(1,1,mxREAL); 
    double *pz = mxGetPr(z_array); 
    z = 100; 
    engPutVariable(ep, "z", z_array); 

    engClose(ep); 

    return 0; 
} 

Когда этот код завершения выполнения, я открываю Matlab и попытаться получить доступ к переменной z но Безразлично» t существует. Здесь что-то не хватает? (Я также попытался вставить engEvalString(ep, "global z; disp(z);"); после engPutVariable, но это не помогает.

Я оценил бы любую проницательность вы могли бы быть в состоянии дать мне. Спасибо!

ответ

1

Ваш код выглядит хорошо для меня. По writng engClose (ep), вы закрываете Matlab Engine, поэтому переменная z исчезнет с сеанса Matlab.

EDIT: просмотрев код, я заметил, что z не был затронут z_array. Поэтому попробуйте следующий код

mxArray *z_array = NULL; 
double z[1] = {100}; 
z_array = mxCreateDoubleMatrix(1, 1, mxREAL); 
memcpy((char *) mxGetPr(z_array), (char*) z, sizeof(double)); 
engPutVariable(ep, "z", z_array); 
mxDestroyArray(z_array); 
+0

Спасибо за ответ! Сначала я думал об одном и том же; однако, если я удалю engClose (ep); окно команд Matlab остается открытым, но если я запустил Matlab, в рабочей области или где-либо еще нет переменной с именем z. – MSTTm

+0

Ahh yes I see - теперь возвращается z = 100 из командной строки. Спасибо! Однако есть ли способ получить доступ к этому значению из функции Matlab? Когда я открываю Matlab, в рабочей области нет значения z. – MSTTm

+1

Я не уверен, чтобы понять ваш вопрос, если вы закрываете сессию Matlab, z тоже исчезнет. Чтобы получить доступ к рабочему пространству из функции Matlab, вы можете использовать команду evalin. Например: z = evalin ('base', 'z'); – oro777

Смежные вопросы