Matlab中mex与C混合编程总结
上一篇 / 下一篇 2012-09-05 10:00:28 / 个人分类:C++
`*@d)IUp0 void mexFunction( int nlhs, mxArray *plhs[],int nrhs, const mxArray *prhs[] )
\,W]B(c;u p0-g5l#o[Q5N4RGG0 入口函数有四个参数:prhs为mxArray结构体类型的指针数组,该数组的元素按顺序指向所有的输入参数;51Testing软件测试网j3b5YP ?_j,q'p
;L.N-Id.K*d|.QR7pu0 nrhs为整数类型,它标明了输入参数的个数。
4uGtl;N0k,k JO9b2j&j1Eq E?&w0 plhs:为mxArray结构体类型的指针数组,该数组的元素按顺序指向所有的输出参数;
#qo N$Enx8B!s0 51Testing软件测试网 i0nF C$n$J `(d[nlhs:输出参数的个数
7O!U,v4D`7c)~%v]&J g dC0 51Testing软件测试网,}yA#_"H ~在入口程序完成两件事情:
,Z&l['LG7S3O;Q0EzU"Fg9N,U0 第一:从输入的mxArray结构体中获得计算完毕的数据,然后在用户的子程序中加以使用
Kk I _Ob0OBp `D)cX)q n0 第二:用户可以将计算完毕的结果返回给一个用于输出的mxArray结构体。
ntlf2C K6A6]'OW0n?$`%w)F(AAY0 mex源文件的两个组成部分可以分为两个文件也可以放在一个文件中,必须包含mex.h头文件,该头文件包含matrix.h和一些以mex开头的子函数。
0PJ+tKOX^J0Y/l*^5a"VU'^p0 下面举几个例子:51Testing软件测试网wC^$HIE-a
51Testing软件测试网e G:F\ |.J.v;j Z51Testing软件测试网+y"j9H&f2coA&z
51Testing软件测试网\`jqC5^!D#include "mex.h"
~}?Ld0Ec1@0/* 输入参数 */51Testing软件测试网c Ct
k&w T&M-ve
j~8jD)ZH0
8y9E$e UxrH0#define MInput prhs[0] 51Testing软件测试网k5N+P(n2L
G
/* 输出参数 */
51Testing软件测试网7o8?3q
e%o`&es
#define OUTM plhs[0]
51Testing软件测试网9bF*N4m't`
void mexFunction( int nlhs, mxArray *plhs[],
V^1?y,Q0 int nrhs, const mxArray *prhs[] ) 51Testing软件测试网5b)@#q Aa
{
4Akp_2h:d0 int i,j,N,L;
9f&PJk:?#}0 double *Input,*output;
.oG0a.D+N)PM.cL/I0
1YG;Qg$?0 if (nrhs < 1)
d*O3Q+{](rtr]"F0 {
Djv5E:^0 mexErrMsgTxt("至少需要一个参数!");
)l1d"Mle0 }51Testing软件测试网[Xo*DZ$[)p
Input= mxGetPr(MInput); /*获取矩阵*/
^uF*~\]'u(F+o0N = mxGetM( MInput ); /*获取矩阵的行*/51Testing软件测试网5h\$Rs)O
L = mxGetN( MInput); /*获取矩阵的列*/51Testing软件测试网;J:B8X aX+NN7H
for( i=0;i<N;i++) /*一行一样输出*/51Testing软件测试网M`B@;|K J-E
{51Testing软件测试网sbw/x}8]
for ( j=0;j<L;j++)
U&d!D)N6u+P2j%o-e0 printf("%f ", Input[i+j*N]);/*若索引从1开始则变成i-1+(j-1)*N MATLAB 是按列存数据 */
jZC*t|0 printf("\n"); /*输出完一行,换行*/51Testing软件测试网8r$H'G4Q8x'PfP$h:j$f,X
}
4jQQ#_K%q{r0
|'p5G#d8UF
o o[0 OUTM= mxCreateDoubleMatrix(N,L, mxREAL); /* 建立输出矩阵*/51Testing软件测试网$d8E e$i'e D.\
output=mxGetPr(OUTM);51Testing软件测试网8p+l)Lv%v4hA.q
for( i=0;i<N;i++) /*一行行的赋值*/
%xr?$bu9A0{
Q4Noj
d!qQ6~7C
Q0 for ( j=0;j<L;j++)51Testing软件测试网h,R:aH's
output[i+j*N]=Input[i+j*N];/*若索引从1开始则变成i-1+(j-1)*N*/
)\&s]5xRF;O ZLk8}0 51Testing软件测试网+Nm'HMz_
}
/y8FnDS0hv cYx0 }
下面是字符串的操作:
N9g6W ePO#Cw04t(z^_cUGWv0 51Testing软件测试网U1bA~"Xj
51Testing软件测试网m-G(Gk6Aa g ~/z #include "mex.h"51Testing软件测试网|i @3uku"hA (void) plhs; /* unused parameters */ |
'P.m1V!E5m+f*V(h?0 动态分配内存的例子:
VH;p3F+g8Z0w0e]{v0 51Testing软件测试网7l@TJ%I,?(a;`!hD
51Testing软件测试网:Mq8|On[P,DD #include "mex.h" :rZ"l~~0 51Testing软件测试网*xP1Fx3Z o$a[/* The mxArray in this example is 2x2 */51Testing软件测试网Q$L/o+fKU void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) {51Testing软件测试网4E5LW5mANE(Q? /* Check for proper number of arguments. */51Testing软件测试网
L/L*MyOc1j /* Create a local array and load data */51Testing软件测试网;~A:Q;Y2Q%il&f /* Create a 2-by-2 mxArray; you will copy existing data into it */ )` {!E*@k0 /* Copy data into the mxArray */51Testing软件测试网3z C7o8Xx cwZ /* You must call mxFree(dynamicData) on the local data. |
TAG:
不要让那些真正对你好的人,慢慢的从你的生活中消失,无论爱情还是友情,都需要用心经营。
我的栏目
标题搜索
日历
|
|||||||||
日 | 一 | 二 | 三 | 四 | 五 | 六 | |||
1 | 2 | 3 | 4 | ||||||
5 | 6 | 7 | 8 | 9 | 10 | 11 | |||
12 | 13 | 14 | 15 | 16 | 17 | 18 | |||
19 | 20 | 21 | 22 | 23 | 24 | 25 | |||
26 | 27 | 28 | 29 | 30 | 31 |
我的存档
数据统计
- 访问量: 3342896
- 日志数: 1640
- 建立时间: 2011-12-07
- 更新时间: 2019-12-24