胡春晓+石岩
摘 要: 为解决某火炮动态精度试验数据处理任务急需,综合Matlab和C两种编程语言的优势,采用MEX文件实现Matlab和C混合编程的方法,通过在Matlab中调用解弹道积分和目标解相遇两个C程序模块,高效方便地完成了火炮动态精度试验数据处理软件的开发。测试和应用结果表明该方法可以显著提高编程效率、程序代码复用率和程序执行效率,具有很强的应用参考价值。
关键词: 火炮; 动态精度试验; 数据处理软件; Matlab; C编程语言; 混合编程
中图分类号: TN919.5?34 文献标识码: A 文章编号: 1004?373X(2014)21?0035?03
Implementation of gun accuracy data processing software
based on mixed programming of Matlab and C
HU Chun?xiao, SHI Yan
(94 Detachment, Unit 92941 of PLA, Huludao 125000, China)
Abstract: In order to fulfill the urgent task of gun dynamic accuracy test data processing, the mixed programming method was realized with MEX file by compositing the advantages of the Matlab and C programming language. The development of the gun dynamic accuracy test data processing software was achieved efficiently and easily by calling two C program modules for solution trajectory integral and meeting solution. The testing and application results show that this method can improve the efficiency of programming, program code reuse rate and the execution efficiency, and it has a strong reference value for application.
Keywords: gun; dynamic accuracy test; data processing software; Matlab; C programming language; mixed programming
0 引 言
动态精度是火炮武器系统设计定型阶段的一项重要考核指标,一般由靶场根据武器对典型目标的校飞试验数据解算得出[1],其结果情况往往是决定后续射击精度等试验能否顺利开展的重要参照。而随着靶场试验通信指挥和综合测控装备信息化程度的不断提高,武器装备试验呈现出任务急、节奏快、周期短、要求严等发展趋势[2],因此能否根据不同试验任务需求,选择合适的编程语言和方法,快速高效地完成数据处理软件的编制和测试工作显得尤为重要。
Matlab是一款优秀的科技应用数学软件,具有强大的矩阵运算、数值计算、图形显示和数据分析处理功能,另外它包含了众多专业领域的分析函数库和工具包,在很多实际编程应用中具有简单实用、方便高效的优势,但由于Matlab是一种解释性脚本语言,在执行大规模重复性循环迭代运算时存在效率低下的不足[3]。而C作为目前应用最广泛的编译性语言,具有执行效率高的特点,特别是在进行多层嵌套循环运算时其优势更加明显。但由于C语言缺乏丰富的数学函数库和各工程领域应用工具箱等,读取数据、显示图形等也不方便,这使得其在科学计算及工程应用领域的开发比较复杂,代价较高[4]。采用Matlab和C混合编程方法,通过Matlab的GUIDE开发设计软件用户界面,利用Matlab中丰富的数据处理函数和图形显示库完成精度数据的处理分析,而对计算效率要求较高的弹道积分、解命中迭代等解算模块则通过C语言编制MEX接口函数交由Matlab调用实现。这样可以综合两种编程语言的优点,大大提高编程和程序运行效率,方便高效地编制出实用的数据处理软件。
1 Matlab和C混合编程方法概述
Matlab和C混合编程主要解决两种语言程序互相调用的问题。常见的方法主要有以下几种[5]:
(1) Matlab引擎。采用客户机和服务器计算方式,C程序作为前端客户机,通过调用Matlab引擎,与后台Matlab服务器连接,实现动态通信。
(2) MCC编译器,是Matlab自带的编译器,作用是将M文件转化成C代码,再将代码用C编译器编译链接成可供C调用的动态链接库或独立的应用程序。
(3) Matlab数学函数LIB库。Matlab提供了可供C语言调用的数学函数库和库函数的接口函数,有助于在C程序中快速实现Matlab已有的算法调用。
(4) MEX文件。MEX文件是用C语言按照一定格式编写后,用C编译器编译成的动态链接库。Matlab直接把MEX文件视为它的内建函数进行调用并执行。
2 基于MEX接口函数实现解弹道积分模块
解弹道微分方程组是火炮动态精度数据处理软件解理论诸元中最重要的一环,一般通过龙格?库塔数值积分法解算,由于计算量较大,直接采用Matlab编写的程序运行速度非常慢,通过把耗时长的函数用C语言实现并编译成MEX函数,可以不必在每次运行循环中的语句时都对它们进行解释,从而加快执行速度[6],而且每型火炮在设计定型阶段都有经过充分验证的解弹道积分C程序模块,可以直接调用,减少重复性工作。本文通过编写MEX接口函数实现在Matlab程序中对已有解弹道积分C程序模块的调用,实现步骤如下:
2.1 编译器的安装与配置
由于Matlab默认不带C语言编译器,要编译MEX函数,用户计算机上应该事先安装适配的ANSI C编译器,下面是安装与配置Matlab编译器应用程序MEX的设置的步骤[7]:
(1) 在Matlab 命令窗口中运行mex?setup,出现下列提示:
Please choose your compiler for building external interface (MEX) files:Would you like mex to locate installed compilers [y]/n?
(2) 选择y,Matlab将自动搜索计算机上已安装的外部编译器的类型、版本及所在路径,并列出来让用户选择:
Select a compiler:
[1] Borland C++Builder version 6.0 in C:\Program Files\Borland
[2] Lcc C version 2.4 in D:\Matlab7.1\sys\lcc
[3] Microsoft Visual C version 6.0 in C:\Program Files\Microsoft Visual Studio
[0] None
Compiler:
(3) 选择其中一种(这里选择2)进行确认:
Please verify your choices:
Compiler: Microsoft Visual C version 6.0
Location: C:\Program Files\Microsoft Visual Studio
Are these correct?([y]/n):
(4) 选择y,结束Matlab 编译器的配置。
2.2 编写弹道积分模块MEX接口文件
MEX接口文件是由原C代码加上MEX接口函数组成,它实现了一种接口,把在Matlab中调用函数时输入的自变量通过特定的接口调入了C函数,得出的结果再通过该接口调回Matlab[8]。按照Matlab的MEX接口规范[9],在原解弹道积分C程序模块的基础上编写MEX接口文件BallIntegral.c如下:
#include "mex.h"
#include "ball_integral.h"
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
double
*Bullet; /* 弹种: 0?榴弹, 1? 穿甲弹 */
*Gam, /* 方位角(rad) */
*Phi, /* 射角(rad) */
*dfTf, /* 弹丸飞行时间(s) */
*dfW, /* 风速(m/s) */
*dfBw, /* 风向(rad) */
*dfKv0, /* 初速修正量(%) */
*dfKtz, /* 药温修正量("C)*/
*dfT0, /* 地面温度("C) */
*dfP0, /* 地面气压(百帕) */
*dfH0; /* 地面相对湿度(%) */
double *dfX,*dfY,*dfZ; /* 地面坐标系弹道点坐标位置 */
Bullet=mxGetPr(prhs[0]);
Gam=mxGetPr(prhs[1]);
Phi=mxGetPr(prhs[2]);
dfTf=mxGetPr(prhs[3]);
dfW=mxGetPr(prhs[4]);
dfBw=mxGetPr(prhs[5]);
dfKv0=mxGetPr(prhs[6]);
dfKtz=mxGetPr(prhs[7]);
dfT0=mxGetPr(prhs[8]);
dfP0=mxGetPr(prhs[9]);
dfH0=mxGetPr(prhs[10]);
plhs[0]=mxCreateDoubleMatrix(1,1,mxREAL);
plhs[1]=mxCreateDoubleMatrix(1,1,mxREAL);
plhs[2]=mxCreateDoubleMatrix(1,1,mxREAL);
dfX=mxGetPr(plhs[0]);
dfY=mxGetPr(plhs[1]);
dfZ=mxGetPr(plhs[2]);
BallIntegral(&dfX,&dfY,&dfZ,*Bullet,*Gam,*Phi,*dfTf,*dfW,*dfBw,*dfKv0,*dfKtz,*dfT0,*dfP0,*dfH0);
/*解弹道积分模块 */
}
以上代码中mex.h为使用MEX文件必须包含的头文件;
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])为Matlab的MEX接口函数,负责完成C语言函数与Matlab之间的参数传递,其中nlhs为输出参数数目,plhs为指向输出参数的指针,nrhs为输入参数数目,prhs为指向输入参数的指针。
BallIntegral()为原解弹道积分程序模块,包含在ball_integral.h头文件中。
2.3 编译MEX接口文件
将C文件mex BallIntegral.c,ball_integral.h放入Matlab工作空间,在命令窗口输入命令:mex BallIntegral.c,即可完成MEX文件的编译,生成可被Matlab直接调用的文件BallIntegral.mexw32。
3 火炮精度数据处理软件实现与应用
根据某火炮系统精度数据处理任务需求,应用Matlab图形用户界面开发环境GUIDE提供的界面设计工具集设计火炮动态精度数据处理软件界面如图1所示,界面中包含真值和录取数据读取、跟踪雷达精度处理、火炮系统精度处理三个板块,跟踪雷达和火炮系统精度处理板块中又分别包含基线参数和弹道气象参数输入区、精度结果统计显示区和处理、查看、统计、保存操作按钮区三部分。
图1 火炮动态精度数据处理软件界面
分别用常用的Matlab库函数编写好各按钮、文本框和选择框的回调函数,完成数据文件读入、坐标变换、基线修正、插值、精度统计、绘图等函数,并在求解火炮理论诸元时调用之前编译好的解弹道积分和解相遇MEX函数模块,最终完成精度数据处理软件,应用此数据处理软件绘制的某航次的动态精度试验结果曲线如图2所示。
利用完成的精度数据处理软件对历次火炮武器系统靶场动态精度试验数据进行处理,得到的结果与以前试验数据处理结果相一致,而且在解理论诸元时软件执行效率明显提高。
图2 火炮动态精度结果曲线
4 结 语
MEX文件提供了Matlab调用C语言程序的接口,使得Matlab调用C函数和调用Matlab的内置函数一样方便,当已经有用C编写的大型程序时,大可不必在Matlab中重写,只需写个MEX接口函数做成MEX文件,另外,针对Matlab程序中的部份计算瓶颈(如循环、迭代等),通过MEX文件用C语言实现,可以大大提高运行效率。本文把用MEX文件实现Matlab和C语言混合编程的方法应用到某火炮动态精度试验数据处理软件中,将已有的解弹道积分程序模块(C程序)和要做迭代处理的解相遇模块通过C语言编写MEX文件实现,不仅提高了编程效率,而且提高了代码的复用率和执行速度,取得了非常好的应用效果。
参考文献
[1] 黄守训,杨榜林,田颖,等.舰炮武器系统试验与鉴定[M].北京:国防工业出版社,2005.
[2] 杨榜林,岳全发.军事装备试验学[M].北京:国防工业出版社,2002.
[3] 陈杰.Matlab宝典[M].北京:电子工业出版社,2007.
[4] 谭浩强.C程序设计[M].北京:清华大学出版社,1999.
[5] 穆以东,赵岭.VC++与Matlab混合编程方法研究[J].测控技术,2013,32(9):111?116.
[6] 李天昀,葛临东.综述Matlab与VC++的交互编程[J].计算机仿真,2004,21(9):193?196.
[7] 杨高波,亓波.精通Matlab 7.0混合编程[M].北京:电子工业出版社,2006.
[8] 袁宝吉,周宝林,吴猛猛.基于Matlab接口编程的天体视位置解算[J].四川兵工学报,2011,32(12):65?67.
[9] 刘维.精通Matlab与C/C++混合程序设计[M].北京:北京航空航天大学出版社,2008.
BallIntegral()为原解弹道积分程序模块,包含在ball_integral.h头文件中。
2.3 编译MEX接口文件
将C文件mex BallIntegral.c,ball_integral.h放入Matlab工作空间,在命令窗口输入命令:mex BallIntegral.c,即可完成MEX文件的编译,生成可被Matlab直接调用的文件BallIntegral.mexw32。
3 火炮精度数据处理软件实现与应用
根据某火炮系统精度数据处理任务需求,应用Matlab图形用户界面开发环境GUIDE提供的界面设计工具集设计火炮动态精度数据处理软件界面如图1所示,界面中包含真值和录取数据读取、跟踪雷达精度处理、火炮系统精度处理三个板块,跟踪雷达和火炮系统精度处理板块中又分别包含基线参数和弹道气象参数输入区、精度结果统计显示区和处理、查看、统计、保存操作按钮区三部分。
图1 火炮动态精度数据处理软件界面
分别用常用的Matlab库函数编写好各按钮、文本框和选择框的回调函数,完成数据文件读入、坐标变换、基线修正、插值、精度统计、绘图等函数,并在求解火炮理论诸元时调用之前编译好的解弹道积分和解相遇MEX函数模块,最终完成精度数据处理软件,应用此数据处理软件绘制的某航次的动态精度试验结果曲线如图2所示。
利用完成的精度数据处理软件对历次火炮武器系统靶场动态精度试验数据进行处理,得到的结果与以前试验数据处理结果相一致,而且在解理论诸元时软件执行效率明显提高。
图2 火炮动态精度结果曲线
4 结 语
MEX文件提供了Matlab调用C语言程序的接口,使得Matlab调用C函数和调用Matlab的内置函数一样方便,当已经有用C编写的大型程序时,大可不必在Matlab中重写,只需写个MEX接口函数做成MEX文件,另外,针对Matlab程序中的部份计算瓶颈(如循环、迭代等),通过MEX文件用C语言实现,可以大大提高运行效率。本文把用MEX文件实现Matlab和C语言混合编程的方法应用到某火炮动态精度试验数据处理软件中,将已有的解弹道积分程序模块(C程序)和要做迭代处理的解相遇模块通过C语言编写MEX文件实现,不仅提高了编程效率,而且提高了代码的复用率和执行速度,取得了非常好的应用效果。
参考文献
[1] 黄守训,杨榜林,田颖,等.舰炮武器系统试验与鉴定[M].北京:国防工业出版社,2005.
[2] 杨榜林,岳全发.军事装备试验学[M].北京:国防工业出版社,2002.
[3] 陈杰.Matlab宝典[M].北京:电子工业出版社,2007.
[4] 谭浩强.C程序设计[M].北京:清华大学出版社,1999.
[5] 穆以东,赵岭.VC++与Matlab混合编程方法研究[J].测控技术,2013,32(9):111?116.
[6] 李天昀,葛临东.综述Matlab与VC++的交互编程[J].计算机仿真,2004,21(9):193?196.
[7] 杨高波,亓波.精通Matlab 7.0混合编程[M].北京:电子工业出版社,2006.
[8] 袁宝吉,周宝林,吴猛猛.基于Matlab接口编程的天体视位置解算[J].四川兵工学报,2011,32(12):65?67.
[9] 刘维.精通Matlab与C/C++混合程序设计[M].北京:北京航空航天大学出版社,2008.
BallIntegral()为原解弹道积分程序模块,包含在ball_integral.h头文件中。
2.3 编译MEX接口文件
将C文件mex BallIntegral.c,ball_integral.h放入Matlab工作空间,在命令窗口输入命令:mex BallIntegral.c,即可完成MEX文件的编译,生成可被Matlab直接调用的文件BallIntegral.mexw32。
3 火炮精度数据处理软件实现与应用
根据某火炮系统精度数据处理任务需求,应用Matlab图形用户界面开发环境GUIDE提供的界面设计工具集设计火炮动态精度数据处理软件界面如图1所示,界面中包含真值和录取数据读取、跟踪雷达精度处理、火炮系统精度处理三个板块,跟踪雷达和火炮系统精度处理板块中又分别包含基线参数和弹道气象参数输入区、精度结果统计显示区和处理、查看、统计、保存操作按钮区三部分。
图1 火炮动态精度数据处理软件界面
分别用常用的Matlab库函数编写好各按钮、文本框和选择框的回调函数,完成数据文件读入、坐标变换、基线修正、插值、精度统计、绘图等函数,并在求解火炮理论诸元时调用之前编译好的解弹道积分和解相遇MEX函数模块,最终完成精度数据处理软件,应用此数据处理软件绘制的某航次的动态精度试验结果曲线如图2所示。
利用完成的精度数据处理软件对历次火炮武器系统靶场动态精度试验数据进行处理,得到的结果与以前试验数据处理结果相一致,而且在解理论诸元时软件执行效率明显提高。
图2 火炮动态精度结果曲线
4 结 语
MEX文件提供了Matlab调用C语言程序的接口,使得Matlab调用C函数和调用Matlab的内置函数一样方便,当已经有用C编写的大型程序时,大可不必在Matlab中重写,只需写个MEX接口函数做成MEX文件,另外,针对Matlab程序中的部份计算瓶颈(如循环、迭代等),通过MEX文件用C语言实现,可以大大提高运行效率。本文把用MEX文件实现Matlab和C语言混合编程的方法应用到某火炮动态精度试验数据处理软件中,将已有的解弹道积分程序模块(C程序)和要做迭代处理的解相遇模块通过C语言编写MEX文件实现,不仅提高了编程效率,而且提高了代码的复用率和执行速度,取得了非常好的应用效果。
参考文献
[1] 黄守训,杨榜林,田颖,等.舰炮武器系统试验与鉴定[M].北京:国防工业出版社,2005.
[2] 杨榜林,岳全发.军事装备试验学[M].北京:国防工业出版社,2002.
[3] 陈杰.Matlab宝典[M].北京:电子工业出版社,2007.
[4] 谭浩强.C程序设计[M].北京:清华大学出版社,1999.
[5] 穆以东,赵岭.VC++与Matlab混合编程方法研究[J].测控技术,2013,32(9):111?116.
[6] 李天昀,葛临东.综述Matlab与VC++的交互编程[J].计算机仿真,2004,21(9):193?196.
[7] 杨高波,亓波.精通Matlab 7.0混合编程[M].北京:电子工业出版社,2006.
[8] 袁宝吉,周宝林,吴猛猛.基于Matlab接口编程的天体视位置解算[J].四川兵工学报,2011,32(12):65?67.
[9] 刘维.精通Matlab与C/C++混合程序设计[M].北京:北京航空航天大学出版社,2008.