關於在c++程式中呼叫matlab編譯產生的動態鏈結庫。具體的問題是在 呼叫dll中函式時傳遞引數。我們知道,matlab可以把m**編譯成兩種dll,分別是c語言介面和c++語言介面的dll。問題是關於呼叫 c++介面的dll中的函式,所以這裡我們就以這種dll為例來介紹。在c++介面的dll中,函式的輸入、輸出引數都是mwarray物件。所以問題歸 結為如何在c++程式中使用mwarray。
1. mxarray和mwarray的比較:
1)mxarray是matlab c 函式庫的結構體,而mwarray是matlab c++ 函式庫中對mxarray的包裝類。
其 次,二者的記憶體管理方式不同。mxarray的記憶體管理方式比較鬆散,由於是c函式庫,沒有資料封裝,必須對臨時陣列和約束陣列的概念極為明確,並且須小 心地防止記憶體洩漏(要多寫好多**)。儘管有自動記憶體管理機制 (mlfenternewcontext,mlfreleasepreviouscontext),仍然要處處呼叫mlfassign,麻煩得很。然而 mwarray就好的多,一切交給c++物件去搞定,你只要放心地用就可以了。不過matlab c++函式庫為了防止頻繁記憶體分配和釋放重寫了記憶體分配和釋放等函式。你會發現對於mwarray a,b; a=b;實際上並沒有生成兩個相同資料塊,只是指標,只有發成資料改變時才copy完整資料。
2) 這兩個東西各自有一套與之相對應的函式。函式的返回值型別不同,需要多加注意。
最後,用的時候mxarray要使用指標,而mwarray直接當類物件使。
宣告:mxarray:
mxarray *a;
mwarray
mwarray a;
銷毀mxarray
mxdestroyarray a;
mwarray
mwarray類的析構函式自動銷毀物件
變數傳遞
mxarray
memcpy(dest_ptr,source_ptr,max_size);
mwarray
mwarray in1(3, 3, mxdouble_class, mxreal);
mwarray in2(3, 3, mxdouble_class, mxreal);
in1.setdata(data, 9);
in2.setdata(data, 9);
比較而言,
1、mwarray的宣告更簡潔,不用考慮指標
2、mwarray不用手動釋放記憶體
2. 例子
關於vc與matlab混編的設定,見前幾個**。下面是這個例子用到的m**。它定義了乙個名為test的函式,儲存在test.m檔案中:
function y=test(x)
y=sin(x);
plot(x,y,'*');
end首先把這個函式編譯成c++介面的dll:
mcc -w cpplib:dlltest -t link:lib test.m
結果,我們將會得到包含dlltest .dll,dlltest .h,dlltest .lib等在內的一些檔案。接下來我們只需要這3個檔案。 (dlltest .ctf( 這個檔案在7.1之後的版本就沒有了, 如果是需要, 加上-c 引數。這裡我們不要))
此時,開啟dlltest.h看看,在檔案的最下面我們可以發現c++介面的函式定義。仔細觀察過後,我們可以發現,這個介面函式的引數是按照這樣的順序定義的:輸出引數的個數、輸出引數、以及輸入引數。
然後在vc6中建立乙個vc++工程(我建立了個基於對話方塊做測試),取名為vcmatlab.把以上四個檔案拷貝到vc++工程的源**所在目錄。
工程中加入標頭檔案:dlltest .h
設定工程的引用庫:project—》links裡新增mclmcrrt.lib dlltest.lib(注:debug和release是相互獨立的)
vc工程加入**如下:
#include "mclmcr.h" // mwarray宣告
#include "dlltest.h"
vc與matlab混編之引擎
include stdafx.h include include engine.h include matrix.h include math.h using namespace std void main engine ep if ep engopen null cout can not star...
如何實現matlab與c c 混編
很多情況下,機器學習的演算法都是在matlab下實現的。當然我發現現在很多也是用python寫的。這些其實都不重要。師兄經常抱怨cnn dpm在matlab下實現一張圖的行人檢測速度實在是太慢。採取了c和matlab的混編。今天我們就來看看究竟怎麼混編的。其實說到底就是一維指標!1.首先安裝編譯器。...
VC和Matlab混編第一課
vc和matlab混編,最常用的就是用前者編寫介面exe,後者編寫演算法dll。特別是在後者擅長的領域,如數學 等顯得特別有意義。先說dll生成。有下面乙個m檔案,實現加法功能,c a b,如下 function c abc a,b c a b 設檔名為abc.m。在matlab中載入此檔案後,執行...