Matlab與VC混合程式設計

2021-04-18 05:34:12 字數 4642 閱讀 7406

眾所周知,matlab是一套功能非常強大的商業數學軟體,從訊號處理,語音處理,資料採集,數值運算,影象處理,到電子**,金融分析等等,幾乎在各個工業領域,他都已經得到了廣泛應用,同時也取得了巨大的成功。

但是,由於matlab是用一種指令碼語言,他的解釋是逐行執行的,程式中所有的變數都是用mxarray來實現的,所以為了保證通用性,它的執行效率非常低,這就是我們常常看到的:在開發一些複雜的演算法時,通常會發現程式執行得特別慢,雖然mathworks公司已經在竭力提高m指令碼檔案(script files)的運算速度,但目前為止效果仍然不能和實現同樣功能的可執行程式相比。而且m指令碼檔案是不能脫離matlab這個應用程式環境,這就大大制約了程式的可移植性和通用性。

本文的目的正是基於上述考慮,介紹如何利用matlab提供的c/c++編譯器,將m檔案編譯成可執行的應用程式。編譯環境是:ms vc++ 6.0和matlab6.5。

一、

matlab中的操作

1.沒有使用圖形相關的函式

由於matlab的編譯器只能對函式m檔案進行編譯,所以如果原來的程式是指令碼程式應改寫成函式形式。舉例如下:

建立乙個m檔案test1.m,內容如下:

function y = test1(n)

y = 1 ;

for i = 1 : n

y = y * i ;

end

用如下命令對其進行編譯:

mcc

–t –l cpp –h test1.m

(如果程式由多個m檔案組成,在編譯命令中只需要指定主檔案即可,mcc會自動查詢相應的m檔案進行編譯)編譯完成後會得到與m檔名相對應hpp和cpp檔案,本例中是test1.hpp和test1.cpp。2.

使用了圖形相關的函式

建立乙個m檔案test2.m,內容如下:

function test2

plot(rand(10));

用如下命令編譯:

mcc

–p –b sglcpp test2.m

(如果程式由多個檔案組成,處理方法同上)

編譯完成後得到與m檔名相對應的hpp和cpp檔案、乙個主函式檔案、bin目錄中的

兩個fig

檔案以及乙個exe檔案。我們需要的只是與m檔案相對應的hpp檔案、cpp檔案以及bin目錄中的兩個fig檔案,本例中是test2.hpp,test2.cpp以及bin目錄中的figuremenubar.fig和figure*******.fig。

二、vc中的操作

相比matlab中的操作,vc中需要設定眾多的編譯選項,顯得比較複雜。另外,vc中可選的工程型別比較多,本文將說明matlab編譯得到的源程式在如下工程型別中的使用l

l

l 其實在這幾種型別的工程中大部分的操作都是相同的,本文先描述相同的操作,再說明不同的部分。

1.用vc建立相應型別的工程,把第一步中提到的源程式拷貝到工程所在目錄中。

2.選擇選單tools-options-在屬性頁中選擇directories-下拉框中選擇include files,在其最後加入

%matlab6p5%/extern/include/cpp

%matlab6p5%/extern/include

其中%matlab6p5%為matlab的安裝路徑,如下圖所示:

再在下拉框中選擇library files,在最後加入

%matlab6p5%/extern/lib/win32/microsoft/msvc60

%matlab6p5%/extern/lib/win32

如下圖所示:

3.選擇選單project-settings-屬性頁link-下拉列表中選擇input,在object/library modules文字框中加入libmmfile.lib libmatlb.lib libmx.lib libmat.lib libmatpm.lib

sgl.lib libmwsglm.lib libmwservices.lib

注意下面的ignore libraries文字框,這裡需要根據不同的工程型別進行填寫,稍後再分情況說明。如下圖所示:

4.選擇c/c++屬性頁,在下拉列表中選擇preprocessor,在preprocessor definitions中加入msvc,ibmpc,mswind如下圖所示:

再在下拉框中選擇precomplied headers,選中automatic use of precompiled headers,在其中填入stdafx.h,如下圖

5.選擇選單project-add to project-files把所有拷貝過來的cpp檔案加入到當前工程中。

下面再依各種不同型別的工程具體說明

1.

(僅以帶圖形函式的為例,所以需要把test2.hpp和test2.cpp以及兩個fig檔案拷貝到當前工程中)在主對話方塊上新增乙個button,並新增按鈕的相應函式onbutton1。

在按鈕響應函式所在檔案中新增如下**:

#include "test2.hpp"

在按鈕相應函式中新增如下**:

test2();

在對話方塊類的oninitdialog函式中新增如下**:

libmmfileinitialize();

libmwsglminitialize();

mlfhginitialize(null,null);

在對話方塊的訊息wm_destroy的處理函式ondestroy()中加入如下**:

mlfhgterminate();

libmmfileterminate();

libmwsglmterminate();

在上面提到的ignore libraries裡加入msvcrt.lib,此時即可以編譯成功了。

2.

這裡建立了乙個支援mfc的程式,以不帶圖形的函式為例,把test1.hpp和test1.cpp拷貝到當前工程中,

在#include "stdafx.h"下面加入

#include "matlab.hpp"

#include "test1.hpp"

下面加入如下**:

mwarray y,n;

n = 3;

y = test1(n);

double *py = mxgetpr(y.getdata());

printf("%f/n",*py);

在上面提到的ignore libraries裡加入msvcrt.lib,由於matlab的庫函式與vc的輸入輸出函式cout、cin、cerr衝突,所以需要把mfc生成的**中

cerr << _t("fatal error: mfc initialization failed") << endl;

一行刪掉,並且在以後的**中頁不能有cout、cin、cerr。

figuremenubar.fig

和figure*******.fig拷貝到當前工程中。

在#include "stdafx.h"下面新增

#include "test2.hpp"

在winmain函式中新增如下**:

libmmfileinitialize();

libmwsglminitialize();

mlfhginitialize(null,null);

test2();

mlfhgwaitforfigurestodie();

mlfhgterminate();

libmmfileterminate();

libmwsglmterminate();

此時編譯能夠成功,但會出現兩個警告資訊,在ignore libraries裡加入msvcrt.lib,libcd.lib即可去除該資訊。

三、程式的發布

由於程式中呼叫了matlab數學函式庫或圖形庫中的函式,所以需要附帶matlab的這些函式庫才能在沒有安裝matlab的機器上執行。幸好matlab已經把這兩個庫的函式打包了,這樣就省得我們乙個乙個去蒐集了。該檔案就是位於matlab安裝目錄中extern/lib/win32子目錄中的mglarchive.exe。執行該程式即可自動把需要的庫函式解壓到當前目錄中,把編譯好的程式放到該目錄中拷貝到未裝matlab的機器上即可實現脫離matlab。

Matlab與VC混合程式設計

眾所周知,matlab是一套功能非常強大的商業數學軟體,從訊號處理,語音處理,資料採集,數值運算,影象處理,到電子 金融分析等等,幾乎在各個工業領域,他都已經得到了廣泛應用,同時也取得了巨大的成功。但是,由於matlab是用一種指令碼語言,他的解釋是逐行執行的,程式中所有的變數都是用mxarray來...

Matlab與VC混合程式設計

眾所周知,matlab是一套功能非常強大的商業數學軟體,從訊號處理,語音處理,資料採集,數值運算,影象處理,到電子 金融分析等等,幾乎在各個工業領域,他都已經得到了廣泛應用,同時也取得了巨大的成功。但是,由於matlab是用一種指令碼語言,他的解釋是逐行執行的,程式中所有的變數都是用mxarray來...

matlab與VC混合程式設計出現的問題

今天是週三,一周過去的這三天一直在正matlab和vc6混合程式設計的問題。問題最終解決,得到的經驗教訓也不少。網上有很多混合程式設計的資料,首先要弄清楚選擇哪種方式,這方面後續會總結。在vc6中c和c 呼叫matlab不同,c是面向過程的,c 是物件導向的,它們的資料型別和編譯方式存在差異。遇到的...