思路:為了實(shí)現(xiàn)matlab與C++混合編程,采用由m文件構(gòu)造動(dòng)態(tài)鏈接庫(kù)然后在visual
studio中調(diào)用的方法。
本人系統(tǒng):Windows 7旗艦版(32位),VS2010旗艦版,Matlab
R2012b 只有R2010b或以上版本才識(shí)別VS2010編輯器
1. matlab中dll創(chuàng)建
1.1 m文件編寫(xiě)
function [ yt ] = myfitline( x,y,m,xrange,t )
%xy為坐標(biāo)向量,m為多項(xiàng)式階數(shù),xrange為顯示圖上面的坐標(biāo)范圍,t為要求的坐標(biāo)橫軸位置
% Detailed explanation goes here
p=polyfit(x,y,m);%計(jì)算各階系數(shù)p1x^m+p2x^(m-1)+....+ pmx+ p(m+1)
yy=polyval(p,xrange);%計(jì)算一個(gè)區(qū)域內(nèi)的函數(shù)值用于畫(huà)圖
yt=polyval(p,t); % 計(jì)算指定x下的函數(shù)對(duì)應(yīng)的y值
plot(x,y,'r*',xrange,yy,'b')
end
1.2 設(shè)置編譯器
>> mex -setup 選擇VS2010
>> mbuild -setup 選擇VS2010
>> mcc -W cpplib:Myfitline -T link:lib myfitline (這就創(chuàng)建好了)
其中,mcc是Matlab提供的編譯命令,對(duì)于這一點(diǎn),Matlab的幫助說(shuō)明如下:
-W lib:string link:lib其中-W是控制編譯之后的封裝格式,cpplib,是指編譯成C++的lib,cpplib冒號(hào)后面是指編譯的庫(kù)的名字,-T表示目標(biāo),
link:lib表示要連接到一個(gè)庫(kù)文件的目標(biāo),目標(biāo)的名字是后面的myfitline,即你寫(xiě)的m函數(shù)的名字。
運(yùn)行完之后,你的目錄下面,將會(huì)出現(xiàn)以下一些文件:
Myfitline.cpp
Myfitline.exp
Myfitline.dll
Myfitline.exports
Myfitline.h
Myfitline.lib
mccExcludedFiles.log
readme.txt
具體每一個(gè)文件的意思,請(qǐng)查幫助,這里只說(shuō)其中很有用的幾個(gè):
Myfitline.dll是編譯好的動(dòng)態(tài)庫(kù),myfitline這個(gè)函數(shù)封裝在里面,Myfitline.h是對(duì)應(yīng)的頭文件,在C里面調(diào)用這個(gè)函數(shù)的時(shí)候,需要include這個(gè)頭文件,
在這個(gè)頭文件的最后,你可以看到下面的內(nèi)容:
extern LIB_Myfitline_CPP_API void MW_CALL_CONV myfitline(int nargout, mwArray& yt, const mwArray& x,
const mwArray& y, const mwArray& m, const mwArray& xrange, const mwArray& t);
這就是myfitline的C函數(shù)的聲明。nargout表示輸出變量的個(gè)數(shù),其他就是對(duì)應(yīng)了m函數(shù)的幾個(gè)變量。
注意,變量的類型是mwArray,這是Matlab提供的一個(gè)特殊的變量類型(在7.0的版本,編譯之后,變量類型是mxArray)。mwArray是一個(gè)類,具體可以查幫助。
2.系統(tǒng)環(huán)境配置
Computer - > Properties -> Advanced system settings -> Environment Variables -> User Variables -> path, 添加(MATLAB下為MATLAB 2012軟件安裝目錄)
...\MATLAB\extern\lib\win32\microsoft;
...\MATLAB\bin\win32
Computer - > Properties -> Advanced system settings -> Environment Variables -> System Variables -> path, 添加
...\MATLAB\runtime\win32;
...\MATLAB\bin;
...\MATLAB\extern\lib\win32\microsoft;
...\MATLAB\bin\win32
3.vs2010環(huán)境配置
①Property Pages -> VC++ Directories -> Include Directories, 添加(安裝目錄下)
...\MATLAB\extern\include\
②Property Pages -> VC++ Directories -> Library Directories, 添加
...\MATLAB\extern\lib\win32\microsoft
③Property Pages -> C/C++ -> General -> Additional Include Directories, 添加
...\MATLAB\extern\include\
④Property Pages -> Linker -> General -> Additional Library Directories, 添加
...\MATLAB\extern\lib\win32\microsoft
⑤Property Pages -> Linker -> Input -> Additional Dependencies, 添加
libeng.lib
libmat.lib
libmex.lib
libmx.lib
mclmcrrt.lib
mclmcr.lib
Myfitline.lib
4.vs2010下完成程序
把剛才生成的*.h *.dll *.lib文件復(fù)制到剛剛新建的工程的文件夾下,并且用添加—現(xiàn)有項(xiàng)添加的工程中。(此處的*代表你的m文件名稱)
調(diào)用函數(shù) myfitline的文件前要
#include "mclmcr.h"
#include "matrix.h"
#include "mclcppclass.h"
#include "Myfitline.h”
具體程序如下:
void CNewFeatureofStormView::Onposition()
{
// TODO: 在此添加命令處理程序代碼
if( !MyfitlineInitialize())
{
MessageBox(_T("初始化失敗"));
}
// 為變量分配內(nèi)存空間,可以查幫助mwArray
mwArray mwX(5, 1, mxDOUBLE_CLASS); // 5,1表示矩陣的大小(所有maltab只有一種變量,就是矩陣,
mwArray mwY(5, 1, mxDOUBLE_CLASS);//為了和Cpp變量接軌,設(shè)置成1*5的矩陣,mxDOUBLE_CLASS表示變量的精度)
mwArray mwM(1, 1, mxDOUBLE_CLASS);
mwArray mwXR(50,1, mxDOUBLE_CLASS);
mwArray mwYT(1,1, mxDOUBLE_CLASS);
mwArray mwT(1,1, mxDOUBLE_CLASS);
int x[5]={432,435,438,441,443}; //樣本點(diǎn)坐標(biāo)
int y[5]={136,138,140,145,147}; //
int xr[50],m=3,t=446; //參數(shù)設(shè)置
for (int i=400;i<450;i++)
{
xr[i-400]=i;
}
mwX.SetData(x, 5); //調(diào)用類里面的SetData函數(shù)給類賦值
mwY.SetData(y, 5);
mwM.SetData(&m, 1);
mwXR.SetData(xr, 50);
mwT.SetData(&t, 1);
myfitline(1,mwYT,mwX,mwY,mwM,mwXR,mwT);
double c = mwYT.Get(1, 1); //調(diào)用類里面的Get函數(shù)獲取取函數(shù)返回值
CString strNumber;
strNumber.Format(_T("%lf"),c);
MessageBox(strNumber, _T("坐標(biāo)"));
// 后面是一些終止調(diào)用的程序
MyfitlineTerminate();
// terminate MCR
mclTerminateApplication();
}
|