3-8 �q�W�ߪ� C �{���өI�s MATLAB ����

§Ú­Ì°£¤F¥i¥H¸g¥Ñ MATLAB ¨Ó©I¥s¥Ñ C µ{¦¡»y¨¥©Ò¼gªº MATLAB ¨ç¼Æ¤§¥~¡A¤]¥i¥H¤Ï¦V¾Þ§@¡A¤]´N¬O¸g¥Ñ¿W¥ßªº C µ{¦¡¨Ó©I¥s MATLAB ¤ÞÀº¡A¦¹ºØ±¡ªp³q±`µo¥Í¦b§A¤w¸g¦³¤@­Ó¤j«¬ªº C µ{¦¡½X¡A¦ý¬O¥i¯à·Q­n¨Ï¥Î MATLAB ªº¯S®í¥\¯à¨Ó§¹¦¨¬Y¨Ç¯S©wªº¤u§@¡A¨Ò¦p¡G

Hint
  • ¦pªG§A·Q±N¤@­Ó¿W¥ßªº MATLAB µøµ¡À³¥Îµ{¦¡Âà´«¦¨³æ¿Wªº¥i°õ¦æÀÉ¡]Standalone Executable¡A¥ç§Y¤£»Ý­n¦w¸Ë MATLAB §Y¥i¹B§@ªº .exe Àɮס^¡A¨º»ò§A»Ý­nªº¬O¾A¥Î©óMATLAB 5.x ©M 6.x ªº¡uRuntime Server¡v¤u¨ã½c¡A´N¥i¥H±N§Aªº MATLAB µøµ¡À³¥Îµ{¦¡¡]¤£»Ý­n©R¥O¦C¿é¤Jªº MATLAB À³¥Îµ{¦¡¡^Âন .exe ÀɮסA¥]§t©Ò¦³ªº¹Ï§ÎÅã¥Ü¥\¯à¡A¥i¥HÅý¨S¦³¦w¸Ë MATLAB ªº¨ä¥L¤H¨Ï¥Î¡C
  • ¦b MATLAB 7.x¡A¡uRuntime Server¡v¤u¨ã½c¤w¸g¤£´_¦s¦b¡A¨ä¥\¯à¤w¸g·h¨ì¡uMATLAB Compiler¡v¤u¨ã½c¤F¡C

­º¥ý¡A§Ú­Ì¨Ó¬Ý¤@­Ó²³æªº½d¨Ò¡A¨ä¥\¯à¬O¦b C µ{¦¡½X¸Ì­±±Ò°Ê MATLAB ¨Ã°õ¦æ¤@­Ó M ÀÉ®× plotSine.m¡A¦P®É¨q¥X°õ¦æ whos «ü¥O«áªº°T®§¡AC ªº½d¨Òµ{¦¡½X¬O plotViaMatlab01.c¡C°²³]§A¤w¸g³]©w¦n§Aªº C ½sĶ¾¹¡]½Ð¨£¥»³¹²Ä¤G¸`¡^¡A¦Ó¥B°²³]§A¥Îªº¬O Microsoft VC 10.0¡A¨º»ò§Ú­Ì¥i¦b MATLAB ¿é¤J¤U¦C©R¥O¥H½sĶ¦¹ C µ{¦¡½X¡G

Example 1: 03-À³¥Îµ{¦¡¤¶­±/matlabEngine01.moptsFile = [matlabroot '\bin\win64\mexopts\msvc100engmatopts.bat']; mex('-f', optsFile, 'plotViaMatlab01.c'); % ¶i¦æ½sĶ !plotViaMatlab01 % ´ú¸Õµ{¦¡

Hint
  • ¦pªG§Aªº§@·~¨t²Î¬O 32-bit Windows¡A½Ð±N¤W­z½d¨Ò¤§ "win64" §ï¬° "win32".
  • ¦pªG§A¨Ï¥Îªº½sĶ¾¹¬O Microsoft VC 8.0¡A½Ð±N¤W­z½d¨Ò¤§ "msvc100engmatopts.bat" §ï¬° "msvc80engmatopts.bat"¡A¨Ì¦¹Ãþ±À¡C

­Y¤@¤ÁµL»~¡A±N·|²£¥Í plotViaMatlab01.exe¡A·í§A°õ¦æ¦¹µ{¦¡½X«á¡A·|±Ò°Ê¥t¤@­Ó MATLAB¡A¨Ã°õ¦æ plotSine.m¡Aµe¥X¤U¦C¹Ï§Î¡G

¦P®É¸õ¥X¤@­Ó°T®§µøµ¡¡A¥HÅã¥Ü MATLAB ¦b°õ¦æ whos «ü¥O«áªº¿é¥X°T®§¡G

¦P®É¤u§@¦C¤]·|Åã¥Ü¤@­Ó MATLAB ªº¹Ï¥Ü¡A¥Nªí MATLAB engine ¥¿¦b°õ¦æ¤¤¡C·í§A«ö¤U°T®§µøµ¡ªº¡u½T©w¡v«á¡AMATLAB engine ¤]´N¸òµÛµ²§ô¤F¡C

plotViaMatlab01.c ªº¤º®e¦p¤U¡G

­ì©lÀÉ¡]03-À³¥Îµ{¦¡¤¶­±/plotViaMatlab01.c¡^¡G¡]¦Ç¦â°Ï°ì«ö¨â¤U§Y¥i«þ¨©¡^
/* ¦¹½d¨Ò»¡©ú¦p¦ó¦b·L³nªºµøµ¡Àô¹Ò¤U¡A¥Ñ C µ{¦¡¨Ó©I¥s MATLAB ¤ÞÀº */
#include <windows.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <direct.h>
#include "mex.h"
#include "engine.h"

#define BUFSIZE 256

int PASCAL WinMain (HINSTANCE hInstance,
                    HINSTANCE hPrevInstance,
                    LPSTR     lpszCmdLine,
                    int       nCmdShow){
	char buffer[BUFSIZE];
	mxArray *app;
	Engine *ep;

	/* ±Ò°Ê MATLAB ¤ÞÀº */
	if (!(ep = engOpen(NULL))){		// ²£¥Í¤@­Ó MATLAB ¤ÞÀºª«¥ó
		MessageBox ((HWND)NULL, (LPSTR)"Can't start MATLAB engine",
			(LPSTR)"plotViaMatlab01.c", MB_OK);
		exit(-1);
	}

	/* ¤Á´«¥Ø¿ý¨Ã°õ¦æ plotSine.m */
	_getcwd(buffer, BUFSIZE);		// ±N¦¹µ{¦¡©Ò¦b¥Ø¿ý¦s¤J¦r¦ê buffer
	app = mxCreateString(buffer);		// ²£¥Í MATLAB ¤º³¡ªº¦r¦êÅÜ¼Æ app
	engPutVariable(ep, "appDir", app);	// ±N¦r¦êÅÜ¼Æ app ¦Ü¤J¤u§@ªÅ¶¡ªºÅÜ¼Æ appDir
	engEvalString(ep, "cd(appDir)");	// ±N MATLAB ªº¤u§@¥Ø¿ý¤Á´«¦Ü¦r¦ê appDir ©Ò«ü©wªº¥Ø¿ý
	engEvalString(ep, "plotSine");		// °õ¦æ¦P¥Ø¿ý¤Uªº plotSine.m
	
	/* ¨ú±o MATLAB ¿é¥X°T®§ */
	engOutputBuffer(ep, buffer, BUFSIZE);	// ³]©w buffer ¥i¥H±µ¦¬ MATLAB ªº¿é¥X°T®§
	engEvalString(ep, "whos");		// ¦b MATLAB ¤ÞÀº°õ¦æ whos «ü¥O
	MessageBox((HWND)NULL, (LPSTR)buffer, (LPSTR) "MATLAB - whos", MB_OK);		// Åã¥Ü buffer ªº¤º®e

	engClose(ep);				// ³Ì«áÃö³¬ MATLAB ¤ÞÀº
	return(0);
}

§Ú­Ì¤w¸g±N¬ÛÃöªº»¡©ú¡A³£¥Hµù¸Ñªº¤è¦¡©ñ¦bµ{¦¡½X¤§¤¤¡C¥D­nªº­«ÂI¥i¥H»¡©ú¦p¤U¡C

  1. ­º¥ý§Ú­Ì­n²£¥Í¤@­Ó MATLAB Engineªºª«¥ó¡A¤~¯à¸g¥Ñ³o­Óª«¥ó±Ò°Ê MATLAB ¥H¤Î©M MATLAB ·¾³q¡A³o¨B¥i¥H¸g¥Ñ¤U¦Cµ{¦¡½X§¹¦¨¡G
    Engine *ep=engOpen(NULL);
  2. ¦A¨Ó°²³]±ý©I¥sªºMATLABµ{¦¡ plotSine.m »P©I¥s¥¦ªº C µ{¦¡¬O©ñ¦b¦P¤@­Ó¥Ø¿ý¡A§Ú­Ì¥²¶·±N MATLAB ¤Á´«¨ì¦¹¥Ø¿ý¡A§@ªk¦p¤U¡G
    • ±N¦¹µ{¦¡©Ò¦b¥Ø¿ý¦s¤J¦r¦ê buffer¡G_getcwd(buffer, BUFSIZE );
    • ²£¥Í MATLAB ¤º³¡ªº¦r¦êÅÜ¼Æ app¡Gapp = mxCreateString(buffer);
    • ±N¦r¦êÅÜ¼Æ app ¦Ü¤J¤u§@ªÅ¶¡ªºÅÜ¼Æ appDir¡GengPutVariable(ep, "appDir", app);
    • ±N MATLAB ªº¤u§@¥Ø¿ý¤Á´«¦Ü¦r¦ê appDir ©Ò«ü©wªº¥Ø¿ý¡GengEvalString(ep, "cd(appDir)");
  3. ³Ì«á´N±N§Ú­Ì·Q­n©I¥sªº MATLAB µ{¦¡ plotSine.m ¶Ç¤J°õ¦æ¡A§Y¥i¤j¥\§i¦¨¡G
  4. engEvalString(ep, "plotSine");
  5. ±µµÛ§Ú­Ì­nÅã¥Ü MATLAB ¦b°õ¦æ whos ¤§«á©Ò±o¨ìªº¿é¥X°T®§¡A§@ªk¦p¤U¡G
    • ³]©w buffer ¥i¥H±µ¦¬ MATLAB ªº¿é¥X°T®§¡GengOutputBuffer(ep, buffer, BUFSIZE);
    • ¦b MATLAB engine °õ¦æ whos «ü¥O¡GengEvalString(ep, "whos");
    • Åã¥Ü buffer ªº¤º®e¡GMessageBox ((HWND)NULL, (LPSTR)buffer, (LPSTR) "MATLAB - whos", MB_OK);
  6. ³Ì«áÃö³¬ MATLAB engine¡GengClose(ep);

¦b¤W­z MATLAB ½d¨Òµ{¦¡¤¤¡A¦pªGµo¥Í½sĶ¿ù»~¡A¥i¯à¬O§A©Ò¨Ï¥Îªº½sĶ¾¹¤£¬O Microsoft VC 10.0¡A¦¹®É­n±N½sĶ°Ñ¼ÆÀÉ optsFile §ï¦¨¾A¦X§A©Ò¥Îªº½sĶ¾¹¡A±`¥Îªº½sĶ°Ñ¼ÆÀÉ®×¥i¥HÅã¥Ü¦p¤U¡G

Example 2: 03-À³¥Îµ{¦¡¤¶­±/showOpsFile.m% ¦pªG§Aªº§@·~¨t²Î¬O 32-bit Windows¡A½Ð±N¤U¦C¤§ "win64" §ï¬° "win32". dir([matlabroot '\bin\win64\mexopts\*engmatopts.bat']) intelc11msvs2008engmatopts.bat msvc100freeengmatopts.bat intelf11msvs2008engmatopts.bat msvc80engmatopts.bat intelf11msvs2008shellengmatopts.bat msvc90engmatopts.bat msvc100engmatopts.bat

¥Ñ¤W­z½d¨Ò¥i¥H¬Ý¥X¡A½sĶ°Ñ¼ÆÀɮצWºÙ³£²Å¦X *engmatopts.bat ªº®æ¦¡¡A®Ú¾Ú§A¨Ï¥Îªº½sĶ¾¹¡A´N¥i¥H§ä¨ì¬ÛÃöªº½sĶ°Ñ¼ÆÀÉ¡C

Hint
­Y¦b½sĶ©Î°õ¦æ¹Lµ{¤¤¡AÁÙ¦³¨ä¥L¿ù»~°T®§¡A¥i¥H¨ì¬ü°êÁ`¤½¥qªº§Þ³N¤ä´©ºô­¶¡A¶ñ¤J¬ÛÃöÃöÁä¦r¥H¶i¦æ·j´M¡Aºô§}¬O¡Ghttp://www.mathworks.com/support

¦b¤U­±³o­Ó½d¨Ò¤¤¡A§Ú­Ì¦b C µ{¦¡½X¤º¤ÏÂбN MATLAB ©R¥O°e¨ì MATLAB °õ¦æ¡A¦Ó¤£¥Î©I¥s¤@­Ó¥~³¡ªº M ÀɮסC½sĶ¤Î°õ¦æªº½d¨Ò¦p¤U¡G

Example 3: 03-À³¥Îµ{¦¡¤¶­±/matlabEngine02.moptsFile = [matlabroot '\bin\win64\mexopts\msvc100engmatopts.bat']; mex('-f', optsFile, 'plotViaMatlab02.c'); % ¶i¦æ½sĶ !plotViaMatlab02 % ´ú¸Õµ{¦¡

°õ¦æ plotViaMatlab02.exe ¤§«á¡A¥i¥Hµe¥X¡u¦Û¥Ñ¸¨Å骺¶ZÂ÷»P®É¶¡Ãö«Y¹Ï¡v¡A¦p¤U¡G

plotViaMatlab02.c µ{¦¡½X¦p¤U¡G

­ì©lÀÉ¡]03-À³¥Îµ{¦¡¤¶­±/plotViaMatlab02.c¡^¡G¡]¦Ç¦â°Ï°ì«ö¨â¤U§Y¥i«þ¨©¡^
/* ¦¹½d¨Ò»¡©ú¦p¦ó¦b·L³nªºµøµ¡Àô¹Ò¤U¡A¥Ñ C µ{¦¡¨Ó©I¥s MATLAB ¤ÞÀº */
#include <windows.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "engine.h"

int PASCAL WinMain (HINSTANCE hInstance,
                    HINSTANCE hPrevInstance,
                    LPSTR     lpszCmdLine,
                    int       nCmdShow){
	Engine *ep;
	mxArray *T;
	double time[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};

	/* ±Ò°Ê MATLAB ¤ÞÀº */
	if (!(ep = engOpen(NULL))) {
		MessageBox ((HWND)NULL, (LPSTR)"Can't start MATLAB engine", 
			(LPSTR)"plotViaMatlab02.c", MB_OK);
		exit(-1);
	}
	
	T = mxCreateDoubleMatrix(1, 10, mxREAL);	// ²£¥Í¤@­Ó MATLAB ªº¤º³¡ÅÜ¼Æ T
	memcpy((char *)mxGetPr(T), (char *)time, 10*sizeof(double));	// ±N time ªº­È«þ¨©¨ì T
	engPutVariable(ep, "T", T);					// ±N T ªº­È°e¨ì MATLAB ¤u§@ªÅ¶¡ªºÅÜ¼Æ T

	/* ¦Û¥Ñ¸¨Å骺¦ì²¾¹ï®É¶¡ªº¨ç¼Æ¡Gdistance = (1/2)g.*t.^2 */
	engEvalString(ep, "D = .5.*(-9.8).*T.^2;");			// ±N¦r¦ê°e¨ì MATLAB ¥h°õ¦æ
	engEvalString(ep, "plot(T, D, 'o-');");				// µe¥X°õ¦æµ²ªG
	engEvalString(ep, "title('¦Û¥Ñ¸¨Å骺¶ZÂ÷»P®É¶¡Ãö«Y¹Ï');");
	engEvalString(ep, "xlabel('®É¶¡ (¬í)');");
	engEvalString(ep, "ylabel('¶ZÂ÷ (¦Ì)');");

	mxDestroyArray(T);			// ²¾°£ MATLAB ¤º³¡ÅÜ¼Æ T
	engClose(ep);				// ³Ì«áÃö³¬ MATLAB ¤ÞÀº
	return(0);
}

¦b¤W­z½d¨Ò¤¤¡A¬ÛÃöªº»¡©ú³£¥Hµù¸Ñªº¤è¦¡¼g¦b¤W­zµ{¦¡½X¤º¡A¦b¦¹¤£¦AÂØ­z¡C

¦³Ãö§ó¶i¤@¨B¦p¦ó¨Ï¥Î C ©I¥s MATLAB ¤ÞÀº¡A¥i¬d¾\ MATLAB Helpdesk ¤¤ªº External Interfaces/API ³¹¸`¡uCalling MATLAB from C and Fortran Programs¡v¡A¦³§ó¸Ô²Óªº¤¶²Ð¡C


MATLABµ{¦¡³]­p¡G¶i¶¥½g