在VS2010中調用MATLAB內建函數

整個過程如下:

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",如圖:

修改R:\DLL\spline.m

3. 把"R:\chckxy.m"重命名爲mycheck.m,如圖:

將R:\DLL\chckxy.m重命名爲mycheck.m

4. 在MATLAB中打開"R:\DLL\mycheck.m",修改第1行代碼,把函數名由"chckxy"改爲"mycheck",如圖:

修改函數名chckxy爲mycheck

5. 在MATLAB命令窗口下輸入mcc指令編譯spline.m,即:

1 >> cd R:\DLL
2 >> mcc -W cpplib:libspline -T link:lib spline.m

完成後,在"R:\DLL"下會生成如下的文件,依然,其中的"libspline.dll"、"libspline.h"和"libspline.lib"這三個文件是我們所需的。

mcc生成的文件

6. 接下來,打開VS2010,單擊"文件"菜單--"新建"--"項目":

新建項目

選擇"Visual C++"--"Win32 控制檯應用程序",項目名稱"SplineTest",位置在R盤根目錄,點擊"完成"。

Visual C++--Win32 控制檯應用程序--SplineTest

7. 把"R:\DLL"文件夾下的"libspline.dll"、"libspline.h"和"libspline.lib"三個文件拷貝到新建的SplineTest項目路徑下(即"R:\SplineTest\SplineTest\"下),如圖:

複製DLL到SplineTest項目路徑

8. 在"SplineTest"項目中添加libspline.h頭文件。如圖,在"解決方案資源管理器"中,右鍵單擊"頭文件"--"添加"--"現有項",把第7步中拷貝到"R:\SplineTest\SplineTest\"下的頭文件"libspline.h"添加到"SplineTest"項目中去。

在項目中添加libspline.h頭文件

9. 開始配置SplineTest項目屬性。在"解決方案資源管理器"中,右鍵點擊"SplineTest"--"屬性",打開屬性頁:

解決方案資源管理器--SplineTest屬性

在"SplineTest屬性頁",左邊選中"配置屬性"--"VC++ 目錄",右邊點擊"包含目錄"後的下拉框,點擊"編輯",如圖:

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","確定"。

添加所需的lib

10. 最後,由於我是64位系統,需要配置成64位的方案平臺(對於32位的系統,此步可跳過)。以"Debug"版本爲例,點擊工具欄中"Win32"後的下拉列表,選擇"配置管理器",如圖:

配置管理器

在彈出的"配置管理器"對話框中,點擊"活動方案解決平臺"的下拉列表框,選擇"新建":

新建活動解決方案平臺

接着,在彈出的"新建解決方案平臺"對話框中,一般會自動出現"x64","從此處複製設置"爲"Win32",並自動勾選"創建新的項目平臺",點擊"確定"按鈕。這就意味着之前我們對包含目錄、庫目錄以及鏈接器的設置已被複制到64位平臺中。

新建解決方案平臺

回到"配置管理器"對話框,可以看到"活動方案解決平臺"已爲"x64",點擊"關閉"按鈕。

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調用示例:

1 x = 0:10;
2 y = sin(x);
3 xx = 0:.25:10;
4 yy = spline(x,y,xx)
5 plot(x,y,'o',xx,yy);

上述代碼的plot圖看起來是這樣:

plot

打開"SplineTest"項目中的"SplineTest.cpp",模仿上述MATLAB代碼編寫C++代碼如下:

1 // SplineTest.cpp : 定義控制檯應用程序的入口點。
2  
3 #include "stdafx.h"
4 #include "libspline.h"  //增加頭文件
5 #include <cmath>
6 #include <iostream>
7 #include <iomanip>
8 using namespace std;
9  
10 int _tmain(int argc, _TCHAR* argv[])
11 {
12     //初始化lib(必須)
13     if (!libsplineInitialize())
14         return -1;
15  
16     int i, j;
17     double x[1][11], y[1][11];
18     for(i=0; i<11; i++)
19     {
20         x[0][i] = i;
21         y[0][i] = sin(x[0][i]);
22     }
23  
24     double xx[1][41];
25     for(i=0; i<41; i++)
26         xx[0][i] = i*0.25;
27  
28     double yy[1][41];
29  
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);
34     mwX.SetData(*x, 11);
35     mwY.SetData(*y, 11);
36     mwXX.SetData(*xx, 41);
37     mwYY.SetData(*yy, 41);
38  
39     spline(1, mwYY, mwX, mwY, mwXX);    //調用spline
40  
41     cout<<"yy = "<<endl;
42     i = 0;
43     for(j = 0; j < 41; j++)
44     {
45         //Get第一個參數表示用1個下標訪問元素,j+1是列號(MATLAB下標從1開始,而C++從0開始,故做+1操作)
46         yy[0][j] = mwYY.Get(1,j+1);
47         cout<<setprecision(4)<<right<<setw(10)<<yy[0][j];
48         i++;
49         if(i%7 == 0) cout<<endl;  //換行
50     }
51     cout<<endl;
52  
53     //終止調用
54     libsplineTerminate();
55      
56     return 0;
57 }

運行上述代碼,得到結果如下:

C++運行結果

而對於spline函數,在MATLAB中的調用結果是:

1 yy =
2   Columns 1 through 7
3          0    0.2692    0.5017    0.6938    0.8415    0.9408    0.9878
4   Columns 8 through 14
5     0.9786    0.9093    0.7789    0.5982    0.3810    0.1411   -0.1075
6   Columns 15 through 21
7    -0.3501   -0.5715   -0.7568   -0.8928   -0.9742   -0.9974   -0.9589
8   Columns 22 through 28
9    -0.8578   -0.7032   -0.5065   -0.2794   -0.0342    0.2142    0.4498
10   Columns 29 through 35
11     0.6570    0.8215    0.9357    0.9937    0.9894    0.9196    0.7927
12   Columns 36 through 41
13     0.6198    0.4121    0.1807   -0.0632   -0.3085   -0.5440

結果沒有問題,但慢是一如既往地慢。問題解決,完畢。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章