14-3 ���ͦ@�ɵ{���w

¨Ï¥ÎMATLAB½sĶ¾¹¡A§Ú­Ì¤]¥i¥H²£¥Í¦@¨Éµ{¦¡®w¡]Shared Libraries¡^¡A¥]§t©Ò¦³¥Ñ¨Ï¥ÎªÌ©w¸qªº¨ç¦¡¡A¥H«KÅý¨ä¥L¿W¥ßÀ³¥Îµ{¦¡¨Ó©I¥s¡C

¨Ò¦p¡A°²³]§Ú­Ì­n²£¥Í¤@­Ó¦@¨Éµ{¦¡®w¡A¨ä¥\¯à¥]§t¯x°}¬Û­¼©M¤Ï¯x°}ªº­pºâ¡A¦¹®É§Ú­Ì¥i¥ý©w¸q³o¨â­Ó MATLAB ¨ç¦¡¡AmyMatInv.m¡]­pºâ¤Ï¯x°}¡^¤Î myMatMultiply.m¡]­pºâ¯x°}¬Û­¼¡^¡G

Example 1: 14-matlab½sĶ¾¹/myMatInv.mfunction invMat = myMatInv(mat) %myMatInv: Generate the inverse matrix of the given matrix % Roger Jang, 20080211 invMat=inv(mat);

Example 2: 14-matlab½sĶ¾¹/myMatMultiply.mfunction out = myMatMultiply(mat1, mat2) %myMatEig: Generate the product of two given matrices % Roger Jang, 20080211 out=mat1*mat2;

±µµÛ§Ú­Ì­n±N³o¨â­Ó MATLAB ¨ç¦¡½sĶ¦¨¦@¨Éµ{¦¡®w¡Aµ{¦¡®w¦WºÙ¬° matLib¡A©Ò¨Ï¥Îªº«ü¥O¦p¤U¡G

mcc -B csharedlib:myMatLib myMatInv.m myMatMultiply.m -d sharedLibrary

¦¹®É·|¦b¿é¥X¥Ø¿ý sharedLibrary ²£¥Í¼Æ­ÓÀɮסA¥DÀɦW³£¬O myMatLib¡A³o¨ÇÀɮקY¬O myMatLib µ{¦¡®w¡A§Ú­Ì¥i¥H¨Ï¥Î¤@¯ë¿W¥ßÀ³¥Îµ{¦¡¨Ó©I¥s³o­Óµ{¦¡®w¤º©Ò©w¸qªº¨ç¦¡¡C¥Ñ©ó³o­Óµ{¦¡®w¬O¥Ñ¨â­Ó MATLAB ¨ç¦¡½sĶ©Ò±o¡A¦]¦¹§Ú­Ì¥i¥H±o¨ì¨â­Ó¹ïÀ³ªº C ¨ç¦¡¡A¤À§O¬O mlfMyMatInv ¤Î mlfMyMatMultiply¡A¹ïÀ³Ãö«Y¦p¤U¡G

¨Ï¥Î¦@¨Éµ{¦¡®w myMatLib.dll ¨Ó©I¥s³o¨â­Ó C ¨ç¦¡ªº¿W¥ßÀ³¥Îµ{¦¡½d¨Ò¦p¤U¡G

­ì©lÀÉ¡]14-matlab½sĶ¾¹/myMatLibMain.c¡^¡G¡]¦Ç¦â°Ï°ì«ö¨â¤U§Y¥i«þ¨©¡^
/*=======================================================
 * ¦¹½d¨Òµ{¦¡¥i¥H©I¥s MATLAB ½sĶ¾¹©Ò²£¥Íªºµ{¦¡®w myMatLib
 * Roger Jang, 20080211, 20120812
 *=======================================================*/

#include <stdio.h>
/* ¾É¤J MCR ¼ÐÀYÀÉ¥H¤Î¡]¥Ñ MATLAB ½sĶ¾¹²£¥Í¡^¯S©wÀ³¥Î¬ÛÃöªº¼ÐÀYÀÉ */
#include "myMatLib.h"	


/* Åã¥ÜC¸ê®Æ«¬ºA¬° mxArray ªºÂù­¿ºë·Ç°}¦C */
void matDisplay(const mxArray* in){
	int i, j;
	int rowNum = mxGetM(in);	/* ¾î¦C­Ó¼Æ */
	int colNum = mxGetN(in);	/* ª½¦æ­Ó¼Æ */
	double *data = mxGetPr(in);	/* «ü¨ì¿é¤J°}¦C¤¤ªºÂù­¿ºë·Ç¸ê®Æ */
    
	/* ¦L¥X¸ê®Æ */
	for(i=0; i<colNum; i++){
		for(j=0; j<rowNum; j++)
			printf("%4.2f\t", data[j*colNum+i]);
		printf("\n");
	}
	printf("\n");
}

/* ¥D­n¤u§@¨ç¦¡ */
void *mainFunction(int *errorCode){
	mxArray *in1, *in2;	/* ©w¸q°e¨ìµ{¦¡®w¨ç¦¡ªº¿é¤J¯x°} */
	mxArray *out = NULL;	/* ©w¸qµ{¦¡®w¨ç¦¡ªº¿é¥X¯x°} */
	double data[] = {1, 3, 5, 2, 4, 6, 0, 8, 9};	/* ´ú¸Õ¥Îªº¸ê®Æ */

	/* ©I¥s mclInitializeApplication() ¥H½T»{¦¹À³¥Îµ{¦¡¤w¸g³Q¥¿½T¦a±Ò©l */
	if(!mclInitializeApplication(NULL, 0)){
		fprintf(stderr, "¿ù»~¡GµLªk±Ò©lÀ³¥Îµ{¦¡¡I\n");
		*errorCode=-1;
		return;
	}
	/* ©I¥s myMatLibInitialize() ¥H½T»{ MATLAB½sĶ¾¹ªºµ{¦¡®w¤w¸g³Q¥¿½T¦a±Ò©l */
	if (!myMatLibInitialize()){
		fprintf(stderr,"¿ù»~¡GµLªk±Ò©lµ{¦¡®w¡I\n");
		*errorCode=-2;
		return;
	}
    
	/* ³Ð³y¿é¤J¯x°} */
	in1 = mxCreateDoubleMatrix(3, 3, mxREAL);
	in2 = mxCreateDoubleMatrix(3, 3, mxREAL);
	memcpy(mxGetPr(in1), data, 9*sizeof(double));	/* ±N data ¤¤ªº¸ê®Æ«þ¨©¦Ü in1 */
	memcpy(mxGetPr(in2), data, 9*sizeof(double));	/* ±N data ¤¤ªº¸ê®Æ«þ¨©¦Ü in2 */
    
        /* ©I¥s¥Ñ MATLAB ½sĶ¾¹²£¥Íªºµ{¦¡®w myMatLib */
	/* ­pºâ¯x°}¬Û­¼ */
	mlfMyMatMultiply(1, &out, in1, in2);
	printf("¯x°}¬Û­¼ªºµ²ªG¡G\n"); matDisplay(out);
	mxDestroyArray(out); out=NULL;	/* ¦¬¦^°t¸mµ¹ out ªº°O¾ÐÅé */
	/* ­pºâ¤Ï¯x°} */
	mlfMyMatInv(1, &out, in1);
	printf("­pºâ¤Ï¯x°}ªºµ²ªG¡G\n"); matDisplay(out);
	mxDestroyArray(out); out=NULL;	/* ¦¬¦^°t¸mµ¹ out ªº°O¾ÐÅé */

	/* ¦¬¦^°t¸mµ¹ in1 ©M in2 ªº°O¾ÐÅé */
	mxDestroyArray(in1); in1=NULL;
	mxDestroyArray(in2); in2=NULL;

	/* ©I¥s myMatLibTerminate() ¥H²×¤îÀ³¥Îµ{¦¡®w */
	myMatLibTerminate();
	/* ©I¥s mclTerminateApplication() ¥H²×¤î¦¹À³¥Îµ{¦¡ */
	mclTerminateApplication();
}

/* ¥Dµ{¦¡ */
int main(){
	int errorCode=0;
	mainFunction(&errorCode);
	return(errorCode);
}

­Y­n½sĶ¦¹¿W¥ßµ{¦¡¡A¥i¦b MATLAB ©R¥Oµøµ¡¿é¤J¦p¤U¡G

mbuild -IsharedLibrary myMatLibMain.c sharedLibrary/myMatLib.lib

¨ä¤¤ -IsharedLibrary ­t³d§iª¾ mbuild ¨ì sharedLibrary ¥h·j´M¼ÐÀYÀÉ myMatLib.h¡A¦Ó sharedLibrary/myMatLib.lib «h¬O­t³d¸ü©ú sharedLibrary/myMatLib.dll ªº¨Ï¥Î¤è¦¡¡C°õ¦æ§¹¤W­z«ü¥O«á¡A§Y¥i²£¥Í¿W¥ßÀ³¥Îµ{¦¡ myMatLibMain.exe¡A¦ý¦b¨Ï¥Î¦¹¥i°õ¦æÀɤ§«e¡A§Ú­Ì¥²¶·Åý§@·~¨t²Îª¾¹D myMatLib.dll ªº¦ì¸m¡A§_«h myMatLabMain.exe µLªk¨Ï¥Î¦¹¦@¨Éµ{¦¡®w¡A¦³¨âºØ¤è¦¡¥i¥H¹F¨ì¦¹¥Øªº¡G

  1. ±N sharedLibrary/myMatLib.dll «þ¨©¨ì»P myMatLibMain.exe ¦P¤@¼h¥Ø¿ý¡]°²³]¬O¥Ø«e¥Ø¿ý¡^¡A¹ïÀ³ªº DOS «ü¥O¬O¡G copy /y sharedLibrary/myMatLib.dll .
  2. ±N sharedLibrary ¥[¨ì DOS ªº·j´M¸ô®|¤§¤¤¡C set path=%path%;sharedLibrary
§¹¦¨¤W­z³]©w«á¡A¥u­n¦b DOS ©R¥Oµøµ¡¤U¿é¤J¡umyMatLibMain¡v¡A§Y¥i¬Ý¨ì¦¹µ{¦¡½X°õ¦æªºµ²ªG¡C

­Y§Ú­Ì±N¤W­z¨BÆJ¾ã¦X¦b¤@­Ó«ü¥OÀÉ¡A¥i¥H±o¨ì¤U¦C½d¨Ò¡G

Example 4: 14-matlab½sĶ¾¹/mbuild01.mfprintf('MATLAB version=%s\n', version); if ~exist('sharedLibrary'), mkdir('sharedLibrary'); end fprintf('Creating shared library myMatLib and put it under sharedLibrary...\n'); tic; mcc -B csharedlib:myMatLib myMatInv.m myMatMultiply.m -d sharedLibrary; fprintf('Time for creating shared library = %g sec\n', toc); fprintf('Compiling myMatLibMain.c...\n'); mbuild -IsharedLibrary myMatLibMain.c sharedLibrary/myMatLib.lib fprintf('Copying myMatLib.dll to the current directory...\n'); copyfile('sharedLibrary/myMatLib.dll', '.'); fprintf('Running DOS command: myMatLibMain.exe...\n'); !myMatLibMain.exe MATLAB version=7.14.0.739 (R2012a) Creating shared library myMatLib and put it under sharedLibrary... DEMO Compiler license. The generated application will expire 30 days from today, on Sat Sep 15 20:07:18 2012. Time for creating shared library = 50.5487 sec Compiling myMatLibMain.c... Copying myMatLib.dll to the current directory... Running DOS command: myMatLibMain.exe... ¯x°}¬Û­¼ªºµ²ªG¡G 7.00 10.00 16.00 55.00 70.00 104.00 68.00 88.00 129.00 ­pºâ¤Ï¯x°}ªºµ²ªG¡G -0.86 -1.29 1.14 0.93 0.64 -0.57 -0.14 0.29 -0.14

¦³Ãö mcc ¤Î mbuild «ü¥Oªº¿ï¶µ«Ü¦h¡AŪªÌ¥i¥Ñ¡udoc mcc¡v¤Î¡udoc mbuild¡v±o¨ì§¹¾ãªº½u¤W¤ä´©¡A¦b¦¹¤£¦AÂØ­z¡C


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