胡春曉+石巖
摘 要: 為解決某火炮動態(tài)精度試驗數(shù)據(jù)處理任務急需,綜合Matlab和C兩種編程語言的優(yōu)勢,采用MEX文件實現(xiàn)Matlab和C混合編程的方法,通過在Matlab中調(diào)用解彈道積分和目標解相遇兩個C程序模塊,高效方便地完成了火炮動態(tài)精度試驗數(shù)據(jù)處理軟件的開發(fā)。測試和應用結果表明該方法可以顯著提高編程效率、程序代碼復用率和程序執(zhí)行效率,具有很強的應用參考價值。
關鍵詞: 火炮; 動態(tài)精度試驗; 數(shù)據(jù)處理軟件; 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 引 言
動態(tài)精度是火炮武器系統(tǒng)設計定型階段的一項重要考核指標,一般由靶場根據(jù)武器對典型目標的校飛試驗數(shù)據(jù)解算得出[1],其結果情況往往是決定后續(xù)射擊精度等試驗能否順利開展的重要參照。而隨著靶場試驗通信指揮和綜合測控裝備信息化程度的不斷提高,武器裝備試驗呈現(xiàn)出任務急、節(jié)奏快、周期短、要求嚴等發(fā)展趨勢[2],因此能否根據(jù)不同試驗任務需求,選擇合適的編程語言和方法,快速高效地完成數(shù)據(jù)處理軟件的編制和測試工作顯得尤為重要。
Matlab是一款優(yōu)秀的科技應用數(shù)學軟件,具有強大的矩陣運算、數(shù)值計算、圖形顯示和數(shù)據(jù)分析處理功能,另外它包含了眾多專業(yè)領域的分析函數(shù)庫和工具包,在很多實際編程應用中具有簡單實用、方便高效的優(yōu)勢,但由于Matlab是一種解釋性腳本語言,在執(zhí)行大規(guī)模重復性循環(huán)迭代運算時存在效率低下的不足[3]。而C作為目前應用最廣泛的編譯性語言,具有執(zhí)行效率高的特點,特別是在進行多層嵌套循環(huán)運算時其優(yōu)勢更加明顯。但由于C語言缺乏豐富的數(shù)學函數(shù)庫和各工程領域應用工具箱等,讀取數(shù)據(jù)、顯示圖形等也不方便,這使得其在科學計算及工程應用領域的開發(fā)比較復雜,代價較高[4]。采用Matlab和C混合編程方法,通過Matlab的GUIDE開發(fā)設計軟件用戶界面,利用Matlab中豐富的數(shù)據(jù)處理函數(shù)和圖形顯示庫完成精度數(shù)據(jù)的處理分析,而對計算效率要求較高的彈道積分、解命中迭代等解算模塊則通過C語言編制MEX接口函數(shù)交由Matlab調(diào)用實現(xiàn)。這樣可以綜合兩種編程語言的優(yōu)點,大大提高編程和程序運行效率,方便高效地編制出實用的數(shù)據(jù)處理軟件。
1 Matlab和C混合編程方法概述
Matlab和C混合編程主要解決兩種語言程序互相調(diào)用的問題。常見的方法主要有以下幾種[5]:
(1) Matlab引擎。采用客戶機和服務器計算方式,C程序作為前端客戶機,通過調(diào)用Matlab引擎,與后臺Matlab服務器連接,實現(xiàn)動態(tài)通信。
(2) MCC編譯器,是Matlab自帶的編譯器,作用是將M文件轉(zhuǎn)化成C代碼,再將代碼用C編譯器編譯鏈接成可供C調(diào)用的動態(tài)鏈接庫或獨立的應用程序。
(3) Matlab數(shù)學函數(shù)LIB庫。Matlab提供了可供C語言調(diào)用的數(shù)學函數(shù)庫和庫函數(shù)的接口函數(shù),有助于在C程序中快速實現(xiàn)Matlab已有的算法調(diào)用。
(4) MEX文件。MEX文件是用C語言按照一定格式編寫后,用C編譯器編譯成的動態(tài)鏈接庫。Matlab直接把MEX文件視為它的內(nèi)建函數(shù)進行調(diào)用并執(zhí)行。
2 基于MEX接口函數(shù)實現(xiàn)解彈道積分模塊
解彈道微分方程組是火炮動態(tài)精度數(shù)據(jù)處理軟件解理論諸元中最重要的一環(huán),一般通過龍格?庫塔數(shù)值積分法解算,由于計算量較大,直接采用Matlab編寫的程序運行速度非常慢,通過把耗時長的函數(shù)用C語言實現(xiàn)并編譯成MEX函數(shù),可以不必在每次運行循環(huán)中的語句時都對它們進行解釋,從而加快執(zhí)行速度[6],而且每型火炮在設計定型階段都有經(jīng)過充分驗證的解彈道積分C程序模塊,可以直接調(diào)用,減少重復性工作。本文通過編寫MEX接口函數(shù)實現(xiàn)在Matlab程序中對已有解彈道積分C程序模塊的調(diào)用,實現(xiàn)步驟如下:
2.1 編譯器的安裝與配置
由于Matlab默認不帶C語言編譯器,要編譯MEX函數(shù),用戶計算機上應該事先安裝適配的ANSI C編譯器,下面是安裝與配置Matlab編譯器應用程序MEX的設置的步驟[7]:
(1) 在Matlab 命令窗口中運行mex?setup,出現(xiàn)下列提示:
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接口函數(shù)組成,它實現(xiàn)了一種接口,把在Matlab中調(diào)用函數(shù)時輸入的自變量通過特定的接口調(diào)入了C函數(shù),得出的結果再通過該接口調(diào)回Matlab[8]。按照Matlab的MEX接口規(guī)范[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接口函數(shù),負責完成C語言函數(shù)與Matlab之間的參數(shù)傳遞,其中nlhs為輸出參數(shù)數(shù)目,plhs為指向輸出參數(shù)的指針,nrhs為輸入?yún)?shù)數(shù)目,prhs為指向輸入?yún)?shù)的指針。
BallIntegral()為原解彈道積分程序模塊,包含在ball_integral.h頭文件中。
2.3 編譯MEX接口文件
將C文件mex BallIntegral.c,ball_integral.h放入Matlab工作空間,在命令窗口輸入命令:mex BallIntegral.c,即可完成MEX文件的編譯,生成可被Matlab直接調(diào)用的文件BallIntegral.mexw32。
3 火炮精度數(shù)據(jù)處理軟件實現(xiàn)與應用
根據(jù)某火炮系統(tǒng)精度數(shù)據(jù)處理任務需求,應用Matlab圖形用戶界面開發(fā)環(huán)境GUIDE提供的界面設計工具集設計火炮動態(tài)精度數(shù)據(jù)處理軟件界面如圖1所示,界面中包含真值和錄取數(shù)據(jù)讀取、跟蹤雷達精度處理、火炮系統(tǒng)精度處理三個板塊,跟蹤雷達和火炮系統(tǒng)精度處理板塊中又分別包含基線參數(shù)和彈道氣象參數(shù)輸入?yún)^(qū)、精度結果統(tǒng)計顯示區(qū)和處理、查看、統(tǒng)計、保存操作按鈕區(qū)三部分。
圖1 火炮動態(tài)精度數(shù)據(jù)處理軟件界面
分別用常用的Matlab庫函數(shù)編寫好各按鈕、文本框和選擇框的回調(diào)函數(shù),完成數(shù)據(jù)文件讀入、坐標變換、基線修正、插值、精度統(tǒng)計、繪圖等函數(shù),并在求解火炮理論諸元時調(diào)用之前編譯好的解彈道積分和解相遇MEX函數(shù)模塊,最終完成精度數(shù)據(jù)處理軟件,應用此數(shù)據(jù)處理軟件繪制的某航次的動態(tài)精度試驗結果曲線如圖2所示。
利用完成的精度數(shù)據(jù)處理軟件對歷次火炮武器系統(tǒng)靶場動態(tài)精度試驗數(shù)據(jù)進行處理,得到的結果與以前試驗數(shù)據(jù)處理結果相一致,而且在解理論諸元時軟件執(zhí)行效率明顯提高。
圖2 火炮動態(tài)精度結果曲線
4 結 語
MEX文件提供了Matlab調(diào)用C語言程序的接口,使得Matlab調(diào)用C函數(shù)和調(diào)用Matlab的內(nèi)置函數(shù)一樣方便,當已經(jīng)有用C編寫的大型程序時,大可不必在Matlab中重寫,只需寫個MEX接口函數(shù)做成MEX文件,另外,針對Matlab程序中的部份計算瓶頸(如循環(huán)、迭代等),通過MEX文件用C語言實現(xiàn),可以大大提高運行效率。本文把用MEX文件實現(xiàn)Matlab和C語言混合編程的方法應用到某火炮動態(tài)精度試驗數(shù)據(jù)處理軟件中,將已有的解彈道積分程序模塊(C程序)和要做迭代處理的解相遇模塊通過C語言編寫MEX文件實現(xiàn),不僅提高了編程效率,而且提高了代碼的復用率和執(zhí)行速度,取得了非常好的應用效果。
參考文獻
[1] 黃守訓,楊榜林,田穎,等.艦炮武器系統(tǒng)試驗與鑒定[M].北京:國防工業(yè)出版社,2005.
[2] 楊榜林,岳全發(fā).軍事裝備試驗學[M].北京:國防工業(yè)出版社,2002.
[3] 陳杰.Matlab寶典[M].北京:電子工業(yè)出版社,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].北京:電子工業(yè)出版社,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直接調(diào)用的文件BallIntegral.mexw32。
3 火炮精度數(shù)據(jù)處理軟件實現(xiàn)與應用
根據(jù)某火炮系統(tǒng)精度數(shù)據(jù)處理任務需求,應用Matlab圖形用戶界面開發(fā)環(huán)境GUIDE提供的界面設計工具集設計火炮動態(tài)精度數(shù)據(jù)處理軟件界面如圖1所示,界面中包含真值和錄取數(shù)據(jù)讀取、跟蹤雷達精度處理、火炮系統(tǒng)精度處理三個板塊,跟蹤雷達和火炮系統(tǒng)精度處理板塊中又分別包含基線參數(shù)和彈道氣象參數(shù)輸入?yún)^(qū)、精度結果統(tǒng)計顯示區(qū)和處理、查看、統(tǒng)計、保存操作按鈕區(qū)三部分。
圖1 火炮動態(tài)精度數(shù)據(jù)處理軟件界面
分別用常用的Matlab庫函數(shù)編寫好各按鈕、文本框和選擇框的回調(diào)函數(shù),完成數(shù)據(jù)文件讀入、坐標變換、基線修正、插值、精度統(tǒng)計、繪圖等函數(shù),并在求解火炮理論諸元時調(diào)用之前編譯好的解彈道積分和解相遇MEX函數(shù)模塊,最終完成精度數(shù)據(jù)處理軟件,應用此數(shù)據(jù)處理軟件繪制的某航次的動態(tài)精度試驗結果曲線如圖2所示。
利用完成的精度數(shù)據(jù)處理軟件對歷次火炮武器系統(tǒng)靶場動態(tài)精度試驗數(shù)據(jù)進行處理,得到的結果與以前試驗數(shù)據(jù)處理結果相一致,而且在解理論諸元時軟件執(zhí)行效率明顯提高。
圖2 火炮動態(tài)精度結果曲線
4 結 語
MEX文件提供了Matlab調(diào)用C語言程序的接口,使得Matlab調(diào)用C函數(shù)和調(diào)用Matlab的內(nèi)置函數(shù)一樣方便,當已經(jīng)有用C編寫的大型程序時,大可不必在Matlab中重寫,只需寫個MEX接口函數(shù)做成MEX文件,另外,針對Matlab程序中的部份計算瓶頸(如循環(huán)、迭代等),通過MEX文件用C語言實現(xiàn),可以大大提高運行效率。本文把用MEX文件實現(xiàn)Matlab和C語言混合編程的方法應用到某火炮動態(tài)精度試驗數(shù)據(jù)處理軟件中,將已有的解彈道積分程序模塊(C程序)和要做迭代處理的解相遇模塊通過C語言編寫MEX文件實現(xiàn),不僅提高了編程效率,而且提高了代碼的復用率和執(zhí)行速度,取得了非常好的應用效果。
參考文獻
[1] 黃守訓,楊榜林,田穎,等.艦炮武器系統(tǒng)試驗與鑒定[M].北京:國防工業(yè)出版社,2005.
[2] 楊榜林,岳全發(fā).軍事裝備試驗學[M].北京:國防工業(yè)出版社,2002.
[3] 陳杰.Matlab寶典[M].北京:電子工業(yè)出版社,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].北京:電子工業(yè)出版社,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直接調(diào)用的文件BallIntegral.mexw32。
3 火炮精度數(shù)據(jù)處理軟件實現(xiàn)與應用
根據(jù)某火炮系統(tǒng)精度數(shù)據(jù)處理任務需求,應用Matlab圖形用戶界面開發(fā)環(huán)境GUIDE提供的界面設計工具集設計火炮動態(tài)精度數(shù)據(jù)處理軟件界面如圖1所示,界面中包含真值和錄取數(shù)據(jù)讀取、跟蹤雷達精度處理、火炮系統(tǒng)精度處理三個板塊,跟蹤雷達和火炮系統(tǒng)精度處理板塊中又分別包含基線參數(shù)和彈道氣象參數(shù)輸入?yún)^(qū)、精度結果統(tǒng)計顯示區(qū)和處理、查看、統(tǒng)計、保存操作按鈕區(qū)三部分。
圖1 火炮動態(tài)精度數(shù)據(jù)處理軟件界面
分別用常用的Matlab庫函數(shù)編寫好各按鈕、文本框和選擇框的回調(diào)函數(shù),完成數(shù)據(jù)文件讀入、坐標變換、基線修正、插值、精度統(tǒng)計、繪圖等函數(shù),并在求解火炮理論諸元時調(diào)用之前編譯好的解彈道積分和解相遇MEX函數(shù)模塊,最終完成精度數(shù)據(jù)處理軟件,應用此數(shù)據(jù)處理軟件繪制的某航次的動態(tài)精度試驗結果曲線如圖2所示。
利用完成的精度數(shù)據(jù)處理軟件對歷次火炮武器系統(tǒng)靶場動態(tài)精度試驗數(shù)據(jù)進行處理,得到的結果與以前試驗數(shù)據(jù)處理結果相一致,而且在解理論諸元時軟件執(zhí)行效率明顯提高。
圖2 火炮動態(tài)精度結果曲線
4 結 語
MEX文件提供了Matlab調(diào)用C語言程序的接口,使得Matlab調(diào)用C函數(shù)和調(diào)用Matlab的內(nèi)置函數(shù)一樣方便,當已經(jīng)有用C編寫的大型程序時,大可不必在Matlab中重寫,只需寫個MEX接口函數(shù)做成MEX文件,另外,針對Matlab程序中的部份計算瓶頸(如循環(huán)、迭代等),通過MEX文件用C語言實現(xiàn),可以大大提高運行效率。本文把用MEX文件實現(xiàn)Matlab和C語言混合編程的方法應用到某火炮動態(tài)精度試驗數(shù)據(jù)處理軟件中,將已有的解彈道積分程序模塊(C程序)和要做迭代處理的解相遇模塊通過C語言編寫MEX文件實現(xiàn),不僅提高了編程效率,而且提高了代碼的復用率和執(zhí)行速度,取得了非常好的應用效果。
參考文獻
[1] 黃守訓,楊榜林,田穎,等.艦炮武器系統(tǒng)試驗與鑒定[M].北京:國防工業(yè)出版社,2005.
[2] 楊榜林,岳全發(fā).軍事裝備試驗學[M].北京:國防工業(yè)出版社,2002.
[3] 陳杰.Matlab寶典[M].北京:電子工業(yè)出版社,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].北京:電子工業(yè)出版社,2006.
[8] 袁寶吉,周寶林,吳猛猛.基于Matlab接口編程的天體視位置解算[J].四川兵工學報,2011,32(12):65?67.
[9] 劉維.精通Matlab與C/C++混合程序設計[M].北京:北京航空航天大學出版社,2008.