Connecting C and Matlab

Matlab has a facility for allowing you to run C programs within matlab, and have them take as input and return as output matlab data types. For one simple example, see mex_speedTest.c. The basic rules are: I recommend the following examples of mex C code: Here's an example of compiling and using all three. Before I begin, let me warn you that RankMod2 and FormDualMod2 use the matlab logical type to save space when storing 0/1 data. Early versions of Matlab do not have this data type.
mex explore.c
explore
explore(1)
------------------------------------------------
Name: prhs[0]
Dimensions: 1x1
Class Name: double
------------------------------------------------
	(1,1) = 1
explore(1,2,3)
------------------------------------------------
Name: prhs[0]
Dimensions: 1x1
Class Name: double
------------------------------------------------
	(1,1) = 1
------------------------------------------------
Name: prhs[1]
Dimensions: 1x1
Class Name: double
------------------------------------------------
	(1,1) = 2
------------------------------------------------
Name: prhs[2]
Dimensions: 1x1
Class Name: double
------------------------------------------------
	(1,1) = 3
x = rand(3)
x =
 0.53408 0.8385 0.70274
 0.72711 0.56807 0.54657
 0.30929 0.37041 0.44488
y.a = 1; y.b = 'hi there';
z{1} = 1; z{2} = 'hi there';
explore(x,y,z)
------------------------------------------------
Name: prhs[0]
Dimensions: 3x3
Class Name: double
------------------------------------------------
	(1,1) = 0.534079
	(2,1) = 0.727113
	(3,1) = 0.30929
	(1,2) = 0.838496
	(2,2) = 0.568072
	(3,2) = 0.370414
	(1,3) = 0.70274
	(2,3) = 0.546571
	(3,3) = 0.44488
------------------------------------------------
Name: prhs[1]
Dimensions: 1x1
Class Name: struct
------------------------------------------------
		(1,1).a
------------------------------------------------
Dimensions: 1x1
Class Name: double
------------------------------------------------
	(1,1) = 1
		(1,1).b
------------------------------------------------
Dimensions: 1x8
Class Name: char
------------------------------------------------
	(1,1) hi there
------------------------------------------------
Name: prhs[2]
Dimensions: 1x2
Class Name: cell
------------------------------------------------
total num of cells = 2
		Cell Element: (1,1)
------------------------------------------------
Dimensions: 1x1
Class Name: double
------------------------------------------------
	(1,1) = 1
		Cell Element: (1,2)
------------------------------------------------
Dimensions: 1x8
Class Name: char
------------------------------------------------
	(1,1) hi there
mex RankMod2.c
a = round(rand(4,8))
a =
 1 1 0 0 0 0 1 1
 1 1 0 0 1 1 0 1
 1 0 1 1 0 1 0 1
 1 1 1 0 0 0 0 1
RankMod2(a)
??? Usage: input must be a logical matrix
Error in ==> /home/r1/spielman/www/ECC/cc/RankMod2.mexglx
a = rand(4,8)> 1/2
a =
 0 0 1 1 1 0 1 0
 0 1 0 0 1 1 0 1
 1 1 0 1 0 0 1 1
 1 0 0 1 0 1 0 0
RankMod2(a)
ans =
 4
a = rand(4,4)> 1/2
a =
 1 1 0 0
 1 1 0 0
 0 0 0 1
 0 1 0 0
RankMod2(a)
ans =
 3
a = rand(4,8)> 1/2
a =
 0 0 0 0 0 0 1 1
 1 0 1 0 1 1 1 0
 1 1 1 0 1 0 0 1
 0 0 1 0 1 0 0 1
mex FormDualMod2.c
b = FormDualMod2(a)
b =
 0 0 1 0
 0 0 1 0
 0 1 0 1
 1 0 0 0
 0 1 0 0
 0 0 1 0
 0 0 0 1
 0 0 0 1
explore(b)
------------------------------------------------
Name: prhs[0]
Dimensions: 8x4
Class Name: logical
------------------------------------------------
diary off

Dan Spielman
Last modified: Tue Feb 10 16:46:51 EST 2004

AltStyle によって変換されたページ (->オリジナル) /