C/C++与Matlab混合编程初探
?????本文主要講解如何在Matlab中調(diào)用C/C++的程序,以及如何編寫可供Matlab程序調(diào)用的C/C++程序。
???? 本文主要分以下幾部分:
???? Hello Matlab,用一個簡單的例子來說明如何在Matlab中調(diào)用C/C++的程序,以及可供Matlab調(diào)用的C/C++程序應該注意哪些基本事項。
???? Matlab調(diào)用C/C++程序傳遞參數(shù)。討論在C/C++中是如何使用Matlab傳來的參數(shù)的。
???? Matlab與C/C++混合編程的方法論。給出在一般情況下使用Matlab與C/C++混合編程的方法步驟,讓大家有一個較為清晰的應用此技術(shù)的思路。
???? 關(guān)于數(shù)據(jù)存儲的說明。說明數(shù)據(jù)在Matlab中的存儲方式。
?????注意:本文認為讀者會使用Matlab,掌握C/C++語言,并且有一臺計算機。計算機上安裝有Windows的操作系統(tǒng),操作系統(tǒng)上裝有Matlab以及Visual Studio(比如VS2008,VS2010等)。或者計算機上安裝有Linux的操作系統(tǒng),系統(tǒng)上裝有Matlab,GCC。
hello Matlab
???? 我們一步步完成一個叫“Hello Matlab”的程序。
???? 第一步:在你的計算機D盤下,創(chuàng)建一個目錄命名為HiMat。在D:\HiMat目錄下創(chuàng)建一個文本文件,命名為“abhimat.cpp”。將Code 1中的代碼拷貝到“abhimat.cpp”文件中,保存。(注意,這里建立目錄以及命名等行為不是規(guī)定的,只是為了講解方便)。
第一步:在你的計算機D盤下,創(chuàng)建一個目錄命名為HiMat。在D:\HiMat目錄下創(chuàng)建一個文本文件,命名為“abhimat.cpp”。將Code 1中的代碼拷貝到“abhimat.cpp”文件中,保存。(注意,這里建立目錄以及命名等行為不是規(guī)定的,只是為了講解方便)。
[cpp] view plaincopy print????? “abhimat.cpp”就是將要在Matlab中被調(diào)用的C/C++代碼。
???? 第二步:在Matlab中編譯“abhimat.cpp”。啟動Matlab,進入D:\HiMat目錄,在Matlab命令窗口中執(zhí)行code 2中的命令,根據(jù)提示完成C/C++編譯環(huán)境的配置。注意:如果你有多個編譯器,建議選擇最新的。
[plain] view plaincopy print????? 完成配置后,在Matlab中執(zhí)行Code 3的命令來編譯abhimat.cpp。
????第三步:執(zhí)行編譯后的C/C++程序。在Matlab命令窗口輸入“abhimat”或者”abhimat()”,都可以調(diào)用編譯后的程序,推薦使用后者。
???? 細心的讀者已經(jīng)注意到了:
- 在Matlab中調(diào)用的C/C++函數(shù)名就是編譯后以mex*(這里,*表示任意多個字符,例如mexw64)為后綴名的文件名。
- Matlab執(zhí)行abhimat()命令后,實際執(zhí)行的是mexFunction函數(shù)中的程序。
Matlab調(diào)用C/C++程序傳遞參數(shù)
? ??此節(jié)我們討論下,在供Matlab調(diào)用的C/C++程序中,我們是如何知道Matlab調(diào)用的參數(shù)類型、個數(shù)的。
? ??給出Matlab中調(diào)用C/C++程序的一個實例,如code 4所示。
[plain] view plaincopy print?? ??下面的工作是如何在當前目錄下一個命名為abfunc.cpp的文件中實現(xiàn)mexFunction函數(shù)。在這個函數(shù)中如何獲得Matlab命令中的c、d兩個變量的值,如何返回a、b兩個變量呢。
? ??注意mexFunction函數(shù)中的四個參數(shù),一一作出說明:
? ??nlhs:mexFunction的第一個參數(shù),它指示Matlab的調(diào)用命令中等號左側(cè)有幾個變量。例如,code 4中的調(diào)用,nlhs的值為2,因為它的等號左側(cè)有兩個變量,他們是a和b。
? ??plhs: mexFunction的第二個參數(shù),它指示Matlab的調(diào)用命令中等號左側(cè)變量的指針。例如,code 4中的調(diào)用,plhs[0]表示的是a,plhs[1]表示的是b。
? ??nrhs:mexFunction的第三個參數(shù),它指示Matlab的調(diào)用命令中等號右側(cè)的變量個數(shù)。例如,code 4中的調(diào)用,nrhs的值為2,因為它的等號右側(cè)有兩個變量,他們是c和d。
? ??prhs:mexFunction的第四個參數(shù),它指示Matlab調(diào)用命令中等號右側(cè)的變量指針。例如,code 4中的調(diào)用,prhs[0]表示的是c,prhs[1]表示的是d。
? ??mxArrary是一個不可見的數(shù)據(jù)類型,是Matlab定義的,大家只需要知道m(xù)xArrary的指針與Matlab中的變量一一對應就可以了。
? ??下面實現(xiàn)abfunc.cpp,功能是a=c+d; b = c-d;具體代碼如code 5所示。
[cpp] view plaincopy print?? ??說明一下code 5中用到的函數(shù)。這些函數(shù)大都以mx開頭。mxAssert是斷言,類似于C\C++中的assert。mxGetM獲得Matlab傳來的變量的行數(shù),mxGetN獲得Matlab傳來的變量的列數(shù)。mxCreateDoubleMatrix創(chuàng)建一個2維的Matlab變量,形參分別用于指定變量的行數(shù)、列數(shù)、元素類型(mxREAL表示實數(shù),mxCOMPLEX表示復數(shù))。mxGetData用于獲得內(nèi)存中數(shù)據(jù)塊的首地址。
? ? 編譯并測試Code 5中的代碼,參見Code 6。
[plain] view plaincopy print?? ? Code 6的輸出結(jié)果如下:
[plain] view plaincopy print?
關(guān)于數(shù)據(jù)存儲的說明
? ?Matlab中的數(shù)據(jù)是按列存儲的。例如,a=[1,2;3,4;5,6],a的數(shù)據(jù)在內(nèi)存中的存儲順序是:1、3、5、2、4、6。在C\C++中使用Matlab傳來的變量時,一定要注意數(shù)據(jù)的存儲順序。
Matlab與C/C++混合編程的方法論
鑒于@編程小手 的建議,添加一個關(guān)于使用此方法的方法論流程圖。希望它能讓各位明白在什么情況下可是使用這種混合編程的技術(shù)、如何一步步實現(xiàn)。參見圖1的流程圖:
圖 1、Matlab與C/C++混編方法論流程圖
另附:文中代碼下載位置: http://download.csdn.net/detail/bendanban/7643701
總結(jié)
以上是生活随笔為你收集整理的C/C++与Matlab混合编程初探的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Matlab与C/C++混合编程接口及应
- 下一篇: MFC与Matlab编程总结 (以《Ma