摘要:該文介紹了如何利用Matlab7.0的編譯器實現VC與Matlab聯合編程。并給出具體實例,利用Matlab編譯器在VC中實現層次聚類分析。
關鍵詞:VC;Matlab;Matlab編譯器;層次聚類分析
中圖分類號:TP311文獻標識碼:A文章編號:1009-3044(2009)33-9599-02
Based on MATLAB and the MATLAB Compiler VC Hybrid Programming
JIANG Yao, LIU Zi-wei, LIU Chun-ju
(School of Computer Science and Technology, Southwest China University of Technology, Mianyang 621000, China)
Abstract: How to use Matlab Compiler for VC and Matlab joint programming is described in this article. Using Matlab compiler to implement hierarchical clustering analysis in VC as a detailed example is introducted.
Key words:VC; Matlab; Matlab compiler; hierarchical cluster analysis
Matlab是一種應用領域廣泛的工具軟件。但是,它強大的功能只能在其提供的平臺下使用,很難直接應用于軟件開發,這大大限制了Matlab的應用。而VC++由于其豐富得人機界面,高效的執行效率已經成為基于Windows平臺下開發商業軟件的必備工具。Matlab編譯器的出現可以使VC++與Matlab 完美的結合,發揮各自的優勢。
1 Matlab編譯器的使用
1.1 Matlab Compiler(Matlab編譯器)
Matlab Compiler是Matlab自帶的一個編譯器,它能將M文件轉化成C、C++或p等各種類型的源代碼,并根據需要生成可執行文件、lib文件(庫文件)、dll文件或S函數文件等。由于M文件可以用編譯器轉化成為C 或C++源代碼, 所以該種方式的調用能脫離Matlab平臺,甚至可以在沒有安裝Matlab 的機器上運行。但是Matlab 編譯器只能編譯函數M文件,不能編譯腳本M文件。但是我們通過簡單的修改,就可以把腳本M文件轉變成為函數M文件。這種方法簡單又可靠。
1.2 在VC中使用Matlab Compiler
安裝matlab的同時也安裝了Matlab Compiler,但要實現其功能,還要進行Matlab 編譯器和VC++6.0 集成開發環境的設置。啟動matalb7.0,在命令窗口中輸入mex-setup回車按照提示,根據實際情況進行設置,該文選擇的是VC++6.0。然后就可以用Matlab 編譯器來處理需要調用的函數M文件,在你要處理的M文件所在目錄輸入:
mcc-W cpplib: dllname-T link:lib filename.m
其中dllname 為生成的dll文件的名稱,自己可以按照習慣定義,filename.m為要編譯的M文件名回車,那么會在當前目錄下生成一系列的文件,其中 dllname.dll(動態鏈接庫文件),dllname.ctf(CTF文件),dllname.h(C++頭文件),dllname.lib(引入庫文件)是我們必須的。其余文件是、dllname.cpp(C++源文件)和mccExcludedFiles.log(日志文件)等。
同時,在VC++6.0中也要進行相應的設置,添加include 與Library目錄。新建一個工程,VC菜單Tools—>Options—>Directories—>Show directories for: Include files 添加:
Tools—>Options—>Directories—>Show directories for: Library 添加:
2 基于Matlab編譯器的VC與Matlab混合編程實現層次聚類分析
2.1 創造M源文件
新建M文件,文件名為cluster,在文件中輸入如下:
function m=cluster(x)%函數名
m=pdist(x);%默認使用最小距離作為對象間距離
squareform(m);%將各對象間的距離組成距離矩陣
n=linkage(m);%對象距離排列
dendrogram(n);%可視化聚類結果
2.2 使用Matlab編譯器生成動態鏈接庫
在Matlab Command Window 輸入如下命令:
mcc-W cpplib:libcluster-T link:lib cluster.m
在當前文件夾中會出現以下文件:libcluster.dll,libcluster.lib,libcluster.ctf,libcluster.h,libcluster.cpp,mccExcludedFiles.log以及其他自動生成的文件。
2.3 在VC中調用動態鏈接庫
在VC中創建一個對話框工程,名稱為Test。設計一個簡單的對話框如圖1。
將Matlab編譯器生成的libcluster.dll,libcluster.lib,libcluster.ctf,libcluster.h復制到工程目錄中。將頭文件加入到工程中,并在對話框主cpp文件中寫入#include \"libcluster.h\"。
在構造函數中調用初始化函數mclInitializeApplication(NULL,0)(該函數的作用是設置了一個全局的MCR 狀態, 并且構建MCR 實例),libclusterInitialize()(初始化動態鏈接庫)。代碼如下:
if(!mclInitializeApplication(NULL,0))//初始化應用
{MessageBox(\"Could not initialize the application.\\");
exit(1);}
if (!libclusterInitialize())//初始化庫
{MessageBox(\"Could not initialize the library.\\");
exit(1);}
在按鈕“聚類測試”的響應函數中添加如下代碼:
void CTestDlg::OnTEST()
{mwArray X(5,2,mxDOUBLE_CLASS);//創建5行2列的Matlab矩陣對象
mwArray Y(5,5,mxDOUBLE_CLASS);
double x[] = {1,2,3,4,5,6,7,8,8,0};//創建測試數組
double m[25] = {0};
X.SetData(x,10);// 給輸入 mwArray 對象賦值
cluster(1,Y,X);//執行聚類函數,第一個參數是輸出參數的個數
Y.GetData(m,25);//取出結果
libclusterTerminate();//釋放鏈接庫
mclTerminateApplication();//釋放應用資源}
程序運行結果如下。
由于GetData()函數是以列為單位對矩陣進行賦值,所以上述結果為(1,6),(2,7),(3,8),(4,8),(5,0)5個對象進行的層次聚類的結果。
3 總結
通過以上方式,很好的實現了VC與Matlab的聯合編程,避免了使用大量復雜代碼才能在VC中實現層次聚類,使得兩個軟件可以同時發揮各自優點,更大地方便了我們的軟件開發。
參考文獻:
[1] Han Jiawei,Kamber M.Data Mining Concepts and Techniques[M].Beijing:China Machine Press,2007:30-65.
[2] 陳永超,李漢強.MATLAB7.0與VC6.0的接口技術[J].電腦知識與技術,2006(2):66-67.
[3] 飛思科技產品研發中心.Matlab7基礎與提高[M].北京:電子工業出版社,2005.