Sunteți pe pagina 1din 3

Conectarea Microsoft Visual Studio 2010 cu Matlab R2008a

n acest subcapitol va fi prezentat configurarea interaciuni Microsoft Visual Studio 2010 i Matlab R2008a, eventual conectarea, invocarea comenzilor i schimbrilor de date. n primul rnd este obligatpriu setarea traseului Matlab n meniul Project-> Properties-> VC++Directories. La Include Directories trebuie copiat adresa: C:\Program Files\MATLAB\R2008a\extern\include, iar la Library Directories urmtoarea: C:\Program Files (x86)\MATLAB\R2008a\extern\lib\win32\microsoft. Dup aceste setri mai includm n Project-> Properties-> Linker-> Input-> Additional Dependences urmtoarele librrii necesare pentru a putea lucra cu Matlabul: Libmx.lib, libmex.lib, libeng.lib. Acum putem trece la conectarea la motorul Matlab (n englez Matlab Engine), care are un header engine.h, care va fi inclus n codul surs. n program se creaz un pointer de tip Engine cu ajutorul crora se poate deschide o sesiune nou a Matlabului cu instruciunea engOpen(). Dup ce am realizat conexiunea putem s dm diferite comenzi cu ajutorul metodei engEvalString(Engine* ptr, string cmd). Pentru schimbrile de date ntre C++ i Matlab se poate folosi un tip de date aa numit matrix array mxArray ce este cunoscut n ambele programe. Trimiterea unei valoare a programului C++ la Matlab de face n 4 pai: a. Se creeaz o variabila de tip mxArray

b. Se aloc spaiu mxCreateDoubleMatrix(mwSize m, mwSize n, mxClassID classid, mxComplexity ComplexFlag); c. Se seteaz un pointer ctre variabil mxSetData(mxArray *pm, void *pr) d. Se pune variabila n spaiul de lucru Matlab engPutVariable(Engine *ep, const char *name, const mxArray *pm); Avem posibilitatea de a extragem variabila din Engine cu ajutorul funciilor engGetVariable (Engine *ep, const char *name) i mxGetPr(const mxArray *pm), care returneaz un mxArray respectiv un pointer ctre un double.

Un mic exemplu pentru folosirea Engine-ului se poate vedea n figura 4.3, iar codul surs a programului de test este urmtoarea:
#include "stdafx.h" #include <stdio.h> #include <conio.h> #include <engine.h> #define SIZE 50 int main() { double x[SIZE], y1[SIZE], y2[SIZE]; mxArray *m_X, *m_Y1; for (int i=0; i<SIZE; i++) { x[i]=((double)i); y1[i]=x[i]*x[i]; } Engine *m_pEngine; m_pEngine = engOpen(NULL); //Translatarea datelor din C++ in Matlab m_X=mxCreateDoubleMatrix(1, SIZE, mxREAL); mxSetData(m_X,x); engPutVariable(m_pEngine, "x", m_X); m_Y1=mxCreateDoubleMatrix(1, SIZE, mxREAL); mxSetData(m_Y1,y1); engPutVariable(m_pEngine,"y1", m_Y1); //desenare cu trimiterea comenzii engEvalString(m_pEngine, "plot(x, y1, 'o');"); engEvalString(m_pEngine, "title('y_1 vs. x')"); engEvalString(m_pEngine, "xlabel('x');"); engEvalString(m_pEngine, "ylabel('y (Unit:10)');"); printf("Press any key to close the plot...\n"); getch(); //Inchidere fereatra plot si Engine engEvalString(m_pEngine, "close;"); engClose(m_pEngine); printf("Press any key to exit...\n"); getch(); } return 0;

Figura 1: Exemplu pentru folosirea Matlab Engine

S-ar putea să vă placă și