|
林 岚* 周云波 杨玉星 林家瑞 ( v; z: s. b& F8 O: |/ e/ E2 a, d
- Y, M3 \8 j) C) q, z- m
摘 要 本文首先介绍了当前在国内外十分流行的工程设计和系统仿真软件包Matlab的
: V+ E' \4 @" ]+ ?$ i5 l: Z优缺点,然后展开介绍了Matcom(一种将Matlab与C++结合的工具)的功能及如何使用,最
% D/ j, V7 J* G后对其效果进行了总结。 # @ @/ p' d, A* S1 V$ d
关键词 Matlab Visual C++ Matcom ECG $ [9 J' K# ]' W- X
1 工程设计软件Matlab特点分析 7 \, t9 A; f% ~2 f0 }' L2 T4 b" D
Matlab是MathWorks公司于1982年推出的一套高性能的数值计算和可视化软件。它集数值 8 x: r2 b% E+ J* O: P* X0 m4 I: a
分析、矩阵运算、信号处理和图形显示于一体,构成了一个方便、界面友好的用户环境 ! A7 U, O. C) i6 R R# s
。它还包括了ToolBox(工具箱)的各类问题的求解工具,可用来求解特定学科的问题。其
9 l% ]1 _ u8 p% D% a+ W特点是:
+ F. I! f0 {+ n: v1 d. f p/ q( Z(1)可扩展性:Matlab最重要的特点是易于扩展,它允许用户自行建立指定功能的M文件
/ o* b$ j) X9 A: d。对于一个从事特定领域的工程师来说,不仅可利用Matlab所提供的函数及基本工具箱 ; V B: d% U, p! m. _$ H
函数,还可方便地构造出专用的函数,从而大大扩展了其应用范围。当前支持Matlab的 9 g7 q. L# A/ g0 J( }: e
商用Toolbox(工具箱)有数百种之多。而由个人开发的Toolbox则不可计数。 . ]8 t; U: e* r) N3 D4 ^
(2)易学易用性:Matlab不需要用户有高深的数学知识和程序设计能力,不需要用户深刻 $ N$ v/ _4 R" d! ~; \
了解算法及编程技巧。 ' I5 q9 w8 ]' ?8 m
(3)高效性:Matlab语句功能十分强大,一条语句可完成十分复杂的任务。如fft语句可
+ F3 n* V F, g- B9 I完成对指定数据的快速傅立叶变换,这相当于上百条C语言语句的功能。它大大加快了工
8 E; h( @2 U" u2 N" h7 x程技术人员从事软件开发的效率。据MathWorks公司声称,Matlab软件中所包含的Matla
0 a- D, Z& l7 V" ~: Q+ O* K# K7 Kb源代码相当于70万行C代码。
/ i" K T+ _4 P由于Matlab具有如此之多的特点,在欧美高等院校,Matlab已成为应用于线性代数、自
( o0 \. z( P: D% t动控制理论、数理统计、数字信号处理、时间序列分析、动态系统仿真等高级课程的基 ! V: N( o4 n% W7 m5 W, Q8 g
本教学工具;在研究单位、工业部门,Matlab也被广泛用于研究和解决各种工程问题。
) i3 l( i8 a( y7 J2 t* h6 V$ y当前在全世界有超过40万工程师和科学家使用它来分析和解决问题。
$ j0 R! b% P! Y' J然而Matlab自身所存在的某些缺点限制了它的应用范围。 * |" {; k* A1 `+ g
(1)Matlab是一种解释性语言,因此它的实时效率是相当差的。例如在笔者所从事的 . Y' a: e( g. k) t( i; r* }
一个心电信号处理项目中,采用Matlab语言来处理5分钟的心电数据,在486/66系统机上 7 c0 C1 o+ w: Z0 G3 e/ \
需要25分钟,而同样的算法,用C语言实现,仅需30多秒。由此可见,Matlab的语言执行
& J' |5 u! }0 ]/ q1 o; _' N效率是比较低的。 : \ h* ~) L( X4 N# `
(2)Matlab程序不能脱离其环境运行,因此它不能被用于开发商用软件。 (3)
/ \+ L. E/ G2 b' E$ X/ eMatlab程序可以被直接看到 3 S) |# ^5 |7 m/ @" G$ M# r
2 Matcom:Matlab与C++的完美结合 5 V. j3 q, ?' x1 }/ p
MathTools公司推出的Matcom(可于http://www.mathtools.com处获取)可以说是以上 8 l$ ~8 B5 k& C; M+ L7 e; I, R+ |1 H
问题的完美解决。它可将Matlab的源代码译成同等功能的C++源码。既保持了Matlab的优 + \# Y; e4 g6 Z/ R. F! t
良算法,又保持了C++的高执行效率。
, C! V* T' ^# f- G4 z4 ~) _ 下面将详细介绍如何使Matlab与C++接口。
( W I3 l% ?' {: ~* B5 C7 y& \ 运行环境:Matcom 3.0 Matlab 5.1 Visual C++ 5.0 中文Windows 95 PC:4
; W* C: o x0 }/ I. |% u86/66 (1)首先应设置Matcom所对应的编译器类型、数据类型。 (2)将你所需要 9 }9 k" `: H4 j: H
的.M文件翻译成C源码。 在这里将用一个简单的滤波器程
8 g' a0 i5 c* _( OMatlab源程序: , Y7 r) f$ I( _/ L5 _" \, I
Lin.m G, e9 p7 G& \" d5 p
b=[1 2 1];
f8 S( i, m2 E- [a=[1 -1.58 0.64];n=50;
+ s Q7 J' V6 J$ f5 V/ m" g* Fx=[1, ones(1,n-1)]; ; n( d7 R& |. {# a- e+ \
y=filter(b,a,x);
v3 h# B0 b( @* @& j& pplot(y./70,'*');
* a4 s: k: c) H) Fhold on " ~0 I6 q' l3 E/ i) T
plot(x,'.'); 0 ~, Y" b. V/ C v; |; s
grid;
4 l: c' M) ~% D/ t& B下面给出了经Matcom翻译后的C++源程序。 2 N+ d) l# i2 Z* W4 E! l, v: j
Lin.cpp 2 `$ L- S; A3 W, m) s0 m
M b("b",0,0);
& n! e: `' t9 q! LM a("a",0,0);
" L2 p+ T8 [' @4 mM n("n",0,0); 6 R4 j! n' d% h N( g& i
M x("x",0,0);
$ {' V: U0 z- z+ TM y("y",0,0); 0 l( I# {! d: S4 _1 a
b=(BR(1.0),2.0,1.0); . E }! A! g( }1 q: e, g* ?
a=(BR(1.0),-1.58,0.64);
" \& D. S$ _6 b1 qn=50.0;
7 U: \6 h: \2 a! e% Jx=(BR(1.0),ones(1.0,n-1.0));
2 d4 H' B& B* ^# j) z2 uy=filter(b,a,x); 4 u! F. [- K- z- U* R
plot(rdivide(y,70.0),TM("*")); 6 a2 C$ I1 U* q( _; G4 v
hold(TM("on"));
' @3 I! l3 b( |9 I0 ]plot(x,TM(".")); # p, a) O9 v( Y
grid(); ! U, S& L" n f
(3)Visual C++环境设置。
0 K7 ] q! J3 K, L# W6 \% P: L在Visual C++中的"Project / Settings / C, C++ / Preprocessor /Additional incl 5 _+ K, i2 ]; |/ E% X5 f& F
ude subdirectories"中填入当前Matcom所处的路径.。(如"c:\matcom\")在Visual C ; n" i' c# v7 h3 ~ S2 N( T
++中的工程窗口处" "Project / Add to Project / Files".加入mlibvc0.lib库文件。
7 n0 j# N" v q' C6 @' Z; @: [ ; O3 |( q: Z3 ^1 S' w& e
(4)修改C++源代码。 % l8 r# ? M5 g* n% U2 H- J. u5 q
注意: ( s! q1 i8 N8 M: j( M
①在头文件处应包含matlib.h. #define MLIB 0 #include "matlib.h." ②在 A8 [7 ?3 S7 u* _3 o4 ]
类成员函数CMfcApp::InitInstance中调用. InitM启动对Matlab函数的调用。 BOO
0 Z' \5 J3 h5 [3 b; ~L CEcgstarApp::InitInstance() { TRACE0("initM\n"); initM(s
6 K% `. K x; O) V, itin,stout,sterr); ...... } ③在类构造函数CMfcApp::CMfcApp.中不要
9 B- B+ U) ?- B6 k调用任何Matlab函数
& s# @: W+ n3 j- B$ x8 r④在类构造函数CMfcApp::~CmfcApp中调用exitM结束对Matlab函数的调用。 CEcg * N( `4 j, r7 h( Z2 Q
starApp::~CEcgstarApp() { exitM(); }
1 ~3 D. l+ y8 k6 Z9 \3 l⑤在程序中合适的位置插入经Matcom翻译过后的C++源码。
, ]: x* `% y/ L" ]0 y" t" `⑥编译工程文件,就可得到你所需的结果。 8 u) W- q6 s" k! V* K
3 结束语 , v, Q, C5 E% Q- L7 z! n
笔者在从事生物医学工程ECG信号的检测与处理项目中,对采用不同方法完成同一任务在 7 U* { f- T3 s6 K+ {% S
: n- V0 G& i6 M. U$ G4 X% e代码量和运行时间上进行了比较,如表1、表2所列。 表1 ECG检测核心算法代码量 全 4 Q; s$ `( ^9 d+ L
部用C++编写 全部用Matlab编写 用Matcom转换后的C编写 约3400行 约400行 约600行
. o. I( j! k) s( k& |4 P表2 ECG检测核心算法运行时间 全部用C++编写 全部用Matlab编写 用Matcom转换后的
Z7 L% {$ S0 Q% l; b" U9 sC编写 约30秒 约25分钟 约1分钟 由此可见,采用Matcom进行程序设计,这是一种 + a3 }9 i% ~$ N/ v% g* ]8 m
时间、效率上的极好的折衷,它使得你可以将更多的时间放在项目关键问题的思考上,
- I* y, f, M6 J! ]/ v# p& y而不是放在算法的实现和程序的编码中,对于广大工程技术人员的开发工作是十分有益 9 _1 b o/ c+ U+ o
的。 & Z' E$ }$ C" p. M$ n, @. S
作者单位:华中理工大学生物工程系(武汉 430074)
' f9 ?' {: P9 m5 z( z* j*男,24岁,硕士研究生 |