整個過程如下:
1. 首先在R盤根目錄下創建"DLL"文件夾,然後把spline.m和chckxy.m兩個文件拷貝到"R:\DLL"文件夾下(在我的機器上,spline.m位於文件夾"C:\Program Files\MATLAB\R2012b\toolbox\matlab\polyfun\"下,chckxy.m位於文件夾"C:\Program Files\MATLAB\R2012b\toolbox\matlab\polyfun\private\"下)。
2. 在MATLAB中打開"R:\DLL\spline.m",修改第54行代碼,把"chckxy"改爲"mycheck",如圖:
3. 把"R:\chckxy.m"重命名爲mycheck.m,如圖:
4. 在MATLAB中打開"R:\DLL\mycheck.m",修改第1行代碼,把函數名由"chckxy"改爲"mycheck",如圖:
5. 在MATLAB命令窗口下輸入mcc指令編譯spline.m,即:
2 |
>>
mcc -W cpplib:libspline -T link:lib spline.m |
完成後,在"R:\DLL"下會生成如下的文件,依然,其中的"libspline.dll"、"libspline.h"和"libspline.lib"這三個文件是我們所需的。
6. 接下來,打開VS2010,單擊"文件"菜單--"新建"--"項目":
選擇"Visual C++"--"Win32 控制檯應用程序",項目名稱"SplineTest",位置在R盤根目錄,點擊"完成"。
7. 把"R:\DLL"文件夾下的"libspline.dll"、"libspline.h"和"libspline.lib"三個文件拷貝到新建的SplineTest項目路徑下(即"R:\SplineTest\SplineTest\"下),如圖:
8. 在"SplineTest"項目中添加libspline.h頭文件。如圖,在"解決方案資源管理器"中,右鍵單擊"頭文件"--"添加"--"現有項",把第7步中拷貝到"R:\SplineTest\SplineTest\"下的頭文件"libspline.h"添加到"SplineTest"項目中去。
9. 開始配置SplineTest項目屬性。在"解決方案資源管理器"中,右鍵點擊"SplineTest"--"屬性",打開屬性頁:
在"SplineTest屬性頁",左邊選中"配置屬性"--"VC++ 目錄",右邊點擊"包含目錄"後的下拉框,點擊"編輯",如圖:
在彈出的"包含目錄"對話框中,點擊右上方的"新行"按鈕,在列表框中輸入MATLAB的include文件夾位置後,點擊"確定"按鈕(在我機器上,路徑爲"C:\Program Files\MATLAB\R2012b\extern\include"),如圖:
回到"SplineTest屬性頁",右邊點擊"庫目錄"後的下拉框,點擊"編輯",彈出"庫目錄"對話框,同樣點擊"新行"按鈕,在列表框中輸入MATLAB的lib文件夾位置後確定(由於我的機器是64位系統,路徑爲"C:\Program Files\MATLAB\R2012b\extern\lib\win64\microsoft";如果您是32位系統,路徑應該與"win32"相關)如圖:
再次回到"SplineTest屬性頁",左邊選中"配置屬性"--"鏈接器"--"輸入",右邊點擊"附加依賴項"後的下拉框,點擊"編輯",如圖:
在彈出的"附加依賴項"對話框中,輸入所需的兩個lib文件:"mclmcrrt.lib"和"libspline.lib","確定"。
10. 最後,由於我是64位系統,需要配置成64位的方案平臺(對於32位的系統,此步可跳過)。以"Debug"版本爲例,點擊工具欄中"Win32"後的下拉列表,選擇"配置管理器",如圖:
在彈出的"配置管理器"對話框中,點擊"活動方案解決平臺"的下拉列表框,選擇"新建":
接着,在彈出的"新建解決方案平臺"對話框中,一般會自動出現"x64","從此處複製設置"爲"Win32",並自動勾選"創建新的項目平臺",點擊"確定"按鈕。這就意味着之前我們對包含目錄、庫目錄以及鏈接器的設置已被複制到64位平臺中。
回到"配置管理器"對話框,可以看到"活動方案解決平臺"已爲"x64",點擊"關閉"按鈕。
至此,對"SplineTest"項目配置完畢。
11. 接下來,就是在VS2010中編寫C++代碼調用spline函數了。參考在VC++6.0中調用MATLAB生成的DLL中的四.
編寫代碼調用DLL,我們編寫類似的代碼。可以看到,在加入"SplineTest"項目中的"libspline.h"的第109行,包含有spline函數的聲明:
1 |
extern LIB_libspline_CPP_API void MW_CALL_CONV
spline( int nargout,
mwArray& output, const mwArray&
x, const mwArray&
y, const mwArray&
xx); |
該聲明表示spline的調用接受5個參數:
第1個參數nargout表示返回值的個數,由於只有一個返回值,所以nargout爲1;
第2個參數output表示返回值;
第3個參數x和第4個參數y表示的是樣點數據;
第5個參數xx表示插值的數據點。
爲了驗證所編寫的C++程序對spline函數的調用結果,與MATLAB中的調用結果是否一致,我使用了MATLAB幫助文件中的spline調用示例:
上述代碼的plot圖看起來是這樣:
打開"SplineTest"項目中的"SplineTest.cpp",模仿上述MATLAB代碼編寫C++代碼如下:
4 |
#include
"libspline.h" //增加頭文件 |
10 |
int _tmain( int argc,
_TCHAR* argv[]) |
13 |
if (!libsplineInitialize()) |
17 |
double x[1][11],
y[1][11]; |
21 |
y[0][i]
= sin (x[0][i]); |
30 |
mwArray
mwX(1,11,mxDOUBLE_CLASS); |
31 |
mwArray
mwY(1,11,mxDOUBLE_CLASS); |
32 |
mwArray
mwXX(1,41,mxDOUBLE_CLASS); |
33 |
mwArray
mwYY(1,41,mxDOUBLE_CLASS); |
36 |
mwXX.SetData(*xx,
41); |
37 |
mwYY.SetData(*yy,
41); |
39 |
spline(1,
mwYY, mwX, mwY, mwXX); |
43 |
for (j
= 0; j < 41; j++) |
46 |
yy[0][j]
= mwYY.Get(1,j+1); |
47 |
cout<<setprecision(4)<<right<<setw(10)<<yy[0][j]; |
49 |
if (i%7
== 0) cout<<endl; |
運行上述代碼,得到結果如下:
而對於spline函數,在MATLAB中的調用結果是:
3 |
0
0.2692 0.5017 0.6938 0.8415 0.9408 0.9878 |
5 |
0.9786
0.9093 0.7789 0.5982 0.3810 0.1411 -0.1075 |
7 |
-0.3501
-0.5715 -0.7568 -0.8928 -0.9742 -0.9974 -0.9589 |
9 |
-0.8578
-0.7032 -0.5065 -0.2794 -0.0342 0.2142 0.4498 |
11 |
0.6570
0.8215 0.9357 0.9937 0.9894 0.9196 0.7927 |
13 |
0.6198
0.4121 0.1807 -0.0632 -0.3085 -0.5440 |
結果沒有問題,但慢是一如既往地慢。問題解決,完畢。