EDA365电子论坛网

标题: Windows 64 与 Matlab 64 MEX混合编程初步实例与总结 [打印本页]

作者: piday123    时间: 2020-5-7 09:31
标题: Windows 64 与 Matlab 64 MEX混合编程初步实例与总结
一些实例9 b! A4 `$ f. K# z
       MATLAB2015编译MeanShift6 s7 l$ J( X. K; F) [3 n# M7 `6 {
ProblemSolution& c$ E, B. a; g; e
       找不到编译器或SDK
8 g9 W6 P5 y5 f6 K& f              Problem
4 y1 k' G: w$ J) _              Solution
2 \- C' f4 a# [. D" u# j              注意
0 F! E# y; c( ^- T  B8 _       error C2143 syntax error# d7 ?/ H0 F2 Z) j6 g* m1 a) q
              Problem% Z3 z6 ], Y3 Y2 l" R  H
              Solution
2 o7 g" \+ g% e7 K# k$ M# [% a一些有用的总结
. V2 A+ B9 l# p6 W* c- u       注意系统平台和文件路径
6 _: O! g/ w* Y9 j" y! n       运行效率对比
+ I. X! k% q8 i# B6 Z, @' ]+ ^5 p* ?. m
" I( F) R0 C( V9 v
一些实例1 b' M# w2 @. n2 }% ~* y# A
MATLAB2015编译MeanShift3 G. z$ C; _2 r8 h+ ^3 a( j
MeanShift分割源码包,可以从这里下载,也可以从本人网盘(含MATLAB接口,和编译好的mexw32,mexw64,mexa64)下载。, T8 Y$ U3 W; T" }0 ]
4 D, T+ ]& c' P- M' _5 S
原本代码中没有适用于Windows64和MATLAB64位的mexw64文件,需要自己编译生成,方法很简单,运行文件夹中的compile_edison_wrapper.m文件即可。4 b$ K8 _0 d; W  S; n; U) o  Q# R

/ ?8 S7 x+ T, o3 ]( o, z; E. m" E然后,读入一幅图像,调用edison_wrapper程序实现分割,注意要使edison_wrapper文件夹处于当前路径。如读入一幅Lena RGB图像,分割结果如下:
1 }/ c8 ?; L8 [) U: i9 i& O2 ?) o1 L5 m6 S* _+ Z
I=imread('D:\DataSets\oi\nsi\classical\LenaRGB.bmp');
+ \+ t- B3 v9 _: a[fimage, labels] = edison_wrapper(I, @RGB2Luv);
& E. a, N9 ^" ?/ c4 E8 Q# R) {, m) ofigure
* Q* r- q% A9 U' ~subplot(121); Y" ^) q; x2 i6 @4 p4 }
imshow(I)
* |/ l8 m$ E1 ~% H/ rtitle('Orignal RGB image')) r! |- z4 I* J- ^; v- z; G; ]
subplot(122)
2 R" n9 v0 ^& o/ g* Aimagesc(labels)7 {$ P6 C% c8 O+ [' Y+ d; Q
axis image % 坐标轴与图像尺寸一致
: ]  S, {8 C2 B; Ztitle('Segmentation result:labels')
! |& g+ S7 W# `( U/ n6 ~& N) W
& E" \! m; Y+ p1 b0 S" e4 E0 q
, K. \! x6 E: ]/ _
/ b0 L% K% }, P' M" d
0 T! Y9 D/ k% m& D, `! n, L7 IProblem&Solution/ x( s$ }+ t! l/ ~( A/ z4 S: {) r
找不到编译器或SDK! ^( a# [( R. ^1 f* G2 q+ e
Problem* h' r9 K; E0 a5 i7 F
提示:“未找到支持的编译器或 SDK”,如下图: 2 Z( _6 J' ?% J) V4 ~

2 n+ r/ A  z/ E/ H7 H* V4 u3 c+ K
0 A5 U. c1 f- H3 U* L  |Solution
* P/ i' k3 |# ?; S$ \根据Matlab的提示,安装:Microsoft Windows SDK for Windows 7 and .NET Framework 4 (ISO),在下载页面,有三个ISO文件可以选择,如下表选择第三个,即amd64。
( {) {1 S/ Z+ G0 ~, _; Q8 G3 T. m8 D, E! I3 m" w& s7 S/ O) A, x3 E' O
名称                                          版本
5 j5 S  @% C3 u3 eGRMSDK_EN_DVD.iso                 x86
. o1 _! k" {% g  ^) r& nGRMSDKIAI_EN_DVD.iso             Itanium
/ f. o0 T* W" ]" k7 ^+ i: aGRMSDKX_EN_DVD.iso               amd64
* }) L/ z8 J5 Y2 [# U0 ]
+ g9 {3 M0 @4 z" P0 |/ Q注意
4 E/ ]/ ?0 G4 V2 z如果安装Microsoft Windows SDK for Windows 7 and .NET Framework 4 (ISO)时出现如下错误:% Z: z7 n$ G6 u" C% g2 H
5 t+ I' J  ]0 @: T
A problem occurred while installing selected Windows SDK components.
9 o8 t, _, Q& G, Y9 Y
" C2 h6 e! K% H4 e4 q7 Q2 jInstallation of the “Microsoft Windows SDK for Windows 7” product has reported the following error: Please refer to Samples\Setup\HTML\ConfigDetails.htm document for further information.
" G6 Z4 k0 w0 e" h# o+ I! m+ o
6 _- s8 C* z- `2 n; C- w- @" P; yPlease attempt to resolve the problem and then start Windows SDK setup again. If you continue to have problems with this issue, please visit the SDK team support page at http://go.microsoft.com/fwlink/?LinkId=130245.
2 P+ c; ?" G( f3 T% f4 ~& K2 T- C: ^5 K$ n9 }1 X$ H& j
Click the View Log button to review the installation log.
+ ^) b# R; A. z/ Z/ C0 tTo exit, click Finish.
' @# b" z+ }; [1 B7 \
- D8 I: C9 B) [$ o3 U1 A8 M如下图:
% f2 n; R: b, M; Y5 D  l
2 i: R. d% c8 K+ o' }7 X* [8 M% |) C6 l; e* ]# O. E% |
解决办法:
. r% q6 E  ~$ s/ t* M' F出现此问题,很可能是你的PC机已经安装了:Microsoft Visual C++ 2010,而在安装Microsoft Windows SDK for Windows 7 and .NET Framework 4 (ISO)时默认选择安装Microsoft Visual C++ 2010,如下图,造成的冲突,可以卸载已经安装的,注意32和64位的都要卸载。2 W  d! q( s  Z" B1 L
/ i" g, m% n: q; T5 k# ^5 t5 s
" t3 u! X. ?' C" _3 X8 {+ O% u

# v2 `0 U3 X0 [/ r卸载完成后从新安装即可!!!! O9 ]% c/ H4 d2 e4 i! k( N

, h# S* l9 Z3 P* ~error C2143: syntax error
4 ~0 W  M' n0 h6 ~$ `) }: a6 cProblem
! e- d: [, B* k' N提示错误:error C2143: syntax error : missing ‘;’ before ‘type’,如下图所示:
; c' b3 T( y0 z0 r" A. F' t   m7 k$ ?' f9 }3 |7 J! X6 {3 p/ l
1 b* C5 C; c% x. e: Y
Solution
: }& d( B$ N0 `9 s# E: U# h$ q* C出现这种现象,很可能是你在用VC的编译器编译GNU的C语言写的代码,两个编译器中的C标准不一样。
6 y7 A2 ^8 I. K
. n/ P0 N8 v) H一种方法是将文件后缀名.c,改成.cpp,重新编译,但可能还会有其它的错误。& m0 D" E. g9 y+ a7 q/ l- W
' F  }) n' F5 H5 [1 B
如果源文件是GNU的C代码,建议安装相应的编译器,然后编译,可参考TDM-GCC(gcc/g++)
: c- f3 J3 N9 ^# y6 i. v
9 L2 |$ P5 W" y/ ?9 Q一些有用的总结
) A6 R! ?0 l  ?+ g4 R" P$ Z注意系统平台和文件路径7 T2 @, w/ l, m3 \4 d
MATLAB 匹配查找文件的方式是这样的:
. ~  N- W+ P$ _* D  @1 y: |* O) A8 ?! e2 @7 k
先从当前目录寻找,假如没有,再到搜索路径中从顶层寻找,如果在同一目录下找到了函数名相同的.m文件、.mex…文件,如果.mex…文件和平台匹配,则执行之,反之执行.m文件。3 K; O2 d% z7 o( d* p, _1 p

; E, `* i0 f8 m1 O: R' O; j5 b系统平台. ]: m6 K" C$ i; S# F( `8 p/ y$ l

5 G  D8 `, ]4 {5 Y: i* C6 y, p3 z假如你有这样一个工具包tools,文件结构如下,tools为当前目录: % j. ?- l; b0 F
/ f; w4 O# ?7 Y7 b5 z

6 |7 _! p; h! L% n其中,func.m函数为MATLAB版,同时又用C语言写了类似的函数,并mex混编生成了Linux平台下的:mexa32、mexa64;Windows平台下的:mexw32、mexw64以及MAC平台下的:mexmac文件,如上图。
# @/ E- J+ Z) C/ U" q  ?2 R% P: T5 \) d. j$ A; k
2 ~2 L) w6 X/ e- b

( U- {/ P; i& ?
1 O8 y; B  h3 `0 Z文件路径4 H' p! Z$ D  b+ e2 j% p* p) ^

. h( T. b  i& t# |/ X依然如上图tools目录结构示意所示,tools为当前目录,不同的是:
8 I$ |- J) |5 I: G7 I4 e8 e
7 B" d0 o( p/ ]1 k- c4 m- L
- g5 N1 I9 `7 p8 {# B
! R: Z' O5 k' C& U9 o0 c% k3 p8 R# j! P* v: l
运行效率对比
6 ^( C/ R; a- Y% m8 t, K实验说明:
8 ~  H  f( h7 k2 N# d* W; E+ F/ q/ d0 k  n6 o4 Y- j2 w
主要对比MATLAB与C的(mex函数)分别在32和64位MATLAB上的执行效率。
9 D+ X- _# ~2 a/ S3 {. s6 X9 H; z2 C
0 o2 Y# b- n  w5 I8 |; u实验环境:ThinkPad E430c + Windows 10 + MATLAB 2015a(32bit)/ MATLAB 2015b(64bit)。
6 C* i: f" R; V$ ]4 j8 V3 W7 {( A5 `8 F6 {# N% R; X7 _5 _

% ~  ~0 o& l& }+ _; \test.m 源码:
4 @8 o8 v) w" X( B  T% B
% m; I1 z& X7 [% @N = 2*10e8;# K! l6 D; j4 v5 l! i! e
tic9 ?6 ]& e: ], [% M/ b# Y% E
func(N); }  Y& H* H& @! n
toc
, P3 L% }" S3 E! X; P4 Y
6 q& N% r3 _+ Y) btic5 j9 `* n' M$ l  O2 s5 A
for i=0:N-1
! n0 _2 ^) f; s3 w9 v% u9 s5 ~end
, k4 V2 H0 ~% w  I8 B8 ~8 x7 Qtoc
# s: _! g* K) G- e# |, Y4 ?
7 D" M6 A5 J! f% ^  c- l' |5 _3 e' I) n9 U; [8 ]
混编C代码(func.c):) }& }* D8 H# o8 L& g9 m

0 C1 [1 j+ U% u+ d#include "mex.h" // include head files
, B7 c1 Q0 m  ?6 J// function6 y# [5 S0 I' R3 F
double loopN(double N)
) R) u0 J3 H. @: }3 E{
6 C5 o! Z6 u) j" b4 z8 c8 s    int i = 0;
5 E! M% Q' }+ b5 Q3 O- z$ [    for(i = 0; i< N; i++); $ _- X1 e# T0 A3 L) K
    return i;
" _3 |  s0 F& ^' W/ ^}+ a* z, Z+ B+ l' n
// interface5 ], [0 ~" g: G& `5 l8 t) \
void mexFunction(int nlhs,mxArray *plhs[], int nrhs,const mxArray *prhs[])
5 N; ], S$ p1 x2 i3 P{* b+ ?2 U, s( Z; l
    double *z;3 N# @# |+ F: t% `0 ~! i% p& \
    double N;
; W3 B# V  Q: s  P. s    plhs[0] = mxCreateDoubleMatrix(1, 1, mxREAL);5 a7 n0 ^5 D5 ]' z  R' w9 k& d
    z = mxGetPr(plhs[0]);
# Y2 x% y- Y7 K+ d5 t/ ?( Q    N = *(mxGetPr(prhs[0]));
$ b! P& B5 D6 X% T% V* j  _    *z = loopN(N);
. |* I; M4 Q* S5 h/ l& @0 _}* L. z7 f" j2 q  l+ Y
- X8 v- T$ |0 k+ v0 M
2 o! u" O$ R: ~; Y, G2 g+ s( S

% [9 s9 I" r3 I; b2 ]1 n% i6 I测试MATLAB代码:; E2 Z+ o$ G' d* Z

3 G5 l' L6 z; h$ T& K7 PN = 20;# _" Q& T6 H  r+ q2 h( `
I=imread('D:\DataSets\oi\nsi\classical\BaboonRGB.bmp');
/ R$ M2 N1 G, q+ Y1 @time_using = cputime;1 ?3 i3 Z6 F% K5 |6 R
grayimg = double(rgb2gray(uint8(I)));
7 W7 G+ f' ^$ h5 d- yfor i = 1:N; }8 ~1 z" y$ ]6 Q' W
    [pyr,pind] = buildSpyr(grayimg,3,'sp3Filters');
& q1 L3 m/ {9 Z' ], E4 Q& l    pyramids = getSpyr(pyr,pind);
2 [; e7 P( k- H' J7 W7 u& xend
/ `5 r$ Z" X: v; htime_using = cputime - time_using;
! D' H7 f# K2 H3 ?time_using = time_using/N;2 k8 W) l  Y, F2 F9 V- b4 Q
disp(time_using)7 L" ]& y4 N: g4 |1 d! F7 G
$ o6 p; `2 w6 `& r" }# b
& x" m' [7 s# p
5 Q. o" q3 m' f( i4 a* O
测试MATLAB代码:
- y7 K. k# \" [3 l  ~
8 H- t/ ]5 u, H: B1 y- AN = 20;
6 T' f( a- h3 y- E6 HI=imread('D:\DataSets\oi\nsi\classical\BaboonRGB.bmp');
! X/ R* b* c- G/ ~$ ztime_using = cputime;9 z% q; u$ c7 I
for i = 1:N; d5 W4 h! t; q4 s# K" ^
    [fimage, labels] = edison_wrapper(I, @RGB2Luv);# l0 ?( w7 O5 |! G
end: _; k3 S+ m4 z+ r
time_using = cputime - time_using;2 o& L" F0 s/ @. Z; e
time_using = time_using/N;
9 S2 z& V5 v& w# Q4 d" [5 l0 z) ^disp(time_using)' G! Y. b1 _$ b: d
' A0 N. B& s5 x4 Y: _- n0 ]& T
& r6 n! v0 G; L7 n' i
  \; y) I" {1 `( M: d! }
测试MATLAB代码:
9 k6 e/ w( V' Q% b; q
* W8 u, @/ m& oN = 20;" I1 B2 [( n5 P& H2 t: X, @
I=imread('D:\DataSets\oi\nsi\classical\BaboonRGB.bmp');
; G: \- \+ D4 U6 [time_using = cputime;
1 t2 P- P! D% Q0 K% m( xfor i = 1:N
. g2 }! \* i6 r    [fimage, labels] = edison_wrapper(I, @ExtractFeature,  'SpatialBandWidth', 7, 'RangeBandWidth', 12, 'MinimumRegionArea', 200);
$ w+ O+ A: Y* i- K- ^; gend2 U  o0 P! T; x4 |6 C1 c4 T
time_using = cputime - time_using;  ~; T6 s4 o/ \( y; P% ~. P
time_using = time_using/N;
( n& \2 d6 S0 X8 @disp(time_using)) A) S; {' z: K2 n4 ^' c" i  u5 |

# J: G& |$ v; P! n3 i( M; X2 [7 F; x5 ~" ?
实验结果:
" X1 t! D- E  f& K8 F8 y5 x0 {5 ^1 O2 T. b$ t, o* B
单位:。
# j7 i$ K8 @# o1 ~3 W% m5 A7 v4 w+ G5 e3 o  T9 A
实验序号        MATLAB(32)        MATLAB(64)        C(MEX, 32)        C(MEX, 64)! U5 N9 T0 \6 [/ e+ c# S
1               4.91                  7.42                  4.54                  1.439 G; z* u1 t9 u
2              -                        -                       0.9953              0.4453
# ]0 O8 v6 d4 ?) N, c; n# Z1 `9 T3              -                       -                       4.10                  4.98
- K$ V  R: T8 L* O- ~- D) [+ }: w% M& c4              -                       -                       11.64                17.631 K( f: j" {4 v& X1 p
% X5 k+ K; N1 W: }+ j( D  O
* @# T) R& q( {
实验结果很不可思议!
1 q/ l' J7 ]& s# d$ J2 N4 R% o4 a
, F9 n, [" E. Z$ u0 Q' c) E6 v/ @$ P
2 {  ]2 N2 `% I( {! }% D1 W: E! R4 Y$ w- o- n
对于实验4,观察返回值labels,即超像素的标签,发现32位和64位结果并不一致,但大致相同,图形显示如下:
2 U/ ]4 J$ n& h( O& [/ _
6 I$ D/ r2 ?- N8 J. f! p+ ~  q: P0 R- @3 F, N
MATLAB 32位和64位下得到的labels的部分值: 6 t, W0 c4 \/ J

) G, W$ R+ B+ q6 |& w
) [) Q% K5 s) f6 T$ y: Q. H9 q5 ^9 o2 a% {6 P8 w4 `. ^" u

- H! `- `* }: r; U, w* L* \+ E. {4 Y8 t7 F" q
6 g4 c1 X% G; P* {* D' q; d
0 h! J6 z9 l" N) [% r

, h+ `7 \; J, v7 A( p9 V6 P7 U" N5 e/ g

作者: yin123    时间: 2020-5-7 13:33
就喜欢看实例,实用性比较大,嘿嘿




欢迎光临 EDA365电子论坛网 (https://bbs.eda365.com/) Powered by Discuz! X3.2