1. 程式人生 > >Matlab中 的 mxArray 和 mwArray

Matlab中 的 mxArray 和 mwArray

mwArray和mxArray有什麼區別?

首先,

mxArray:Matlab C 函式庫的結構體

mwArray:Matlab C++ 函式庫中對mxArray的包裝類

其次,二者的記憶體管理方式不同。

mxArray的記憶體管理方式比較鬆散,由於是C函式庫,沒有資料封裝,必須對臨時陣列和約束陣列的概念極為明確,並且須小心地防止記憶體洩漏(要多寫好多程式碼)。儘管有自動記憶體管理機制(mlfEnterNewContext,mlfReleasePreviousContext),仍然要處處呼叫mlfAssign,麻煩得很。

mwArray就好的多,一切交給C++物件去搞定,你只要放心地用就可以了。不過Matlab C++函式庫為了防止頻繁記憶體分配和釋放重寫了記憶體分配和釋放等函式。你會發現對於mwArray a,b; a=b;實際上並沒有生成兩個相同資料塊,只是指標,只有發成資料改變時才copy完整資料。

再次,這兩個東西各自有一套與之相對應的函式。函式的返回值型別不同,需要多加註意。

最後,用的時候mxArray要使用指標,而mwArray直接當類物件使。如果你不是Hardcore級的牛人或具有Hardcore傾向的潛牛人,我強烈建議你使用後者!

舉一個簡單的例子:如果你需要計算c=a+b那麼兩者的區別是這樣的:

[cpp] view plaincopy
01.//----------對於mxArray:------------  
02.void fun()  
03.{  
04.……  
05.double d_a=1,d_b=2;  
06.mxArray *a,*b,*c;  
07.mlfEnterNewContext(0
,0); 08.mlfAssign(&a,mlfScalar(d_a)); 09.mlfAssign(&b,mlfScalar(d_b)); 10.mlfAssign(&c,mlfPlus(a,b)); 11.…… 12.mlfReleasePreviousContext(0,0); 13.mxDestroyArray(a); 14.mxDestroyArray(b); 15.mxDestroyArray(c); 16.} 17. 18.//----------對於mwArray:-------------- 19.void fun() 20
.{ 21.…… 22.mwArray a,b,c; 23.a=1; 24.b=2; 25.c=a+b; 26.…… 27.}

另外一個說法:

宣告:
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不用手動釋放記憶體

下面是這個例子用到的m程式碼。它定義了一個名為test的函式,儲存在test.m檔案中:

[cpp] view plaincopy
01.function y=test(x)  
02.  y=sin(x);  
03.  plot(x,y,'*');  
04.  end   

首先把這個函式編譯成C++介面的DLL:

  mcc -W cpplib:dlltest -T link:lib test.m

得到包含dlltest.dll,dlltest.ctf,dlltest.h,dlltest.lib等在內的一些檔案。

接下來我們只需要這四個檔案。 

此時,開啟dlltest.h看看,在檔案的最下面我們可以發現C++介面的函式定義。仔細觀察過後,我們可以發現,這個介面函式的引數是按照這樣的順序定義的:輸出引數的個數、輸出引數、以及輸入引數。

然後在VC6中建立一個VC++工程,工程中加入標頭檔案:dlltest .h vc工程加入程式碼如下

[cpp] view plaincopy
01.#include "mclmcr.h" // mwArray宣告  
02.#include "dlltest.h"  
03.void CVCMATLABDlg::OnButton1()  
04.{  
05.    mclInitializeApplication(NULL,0);  
06.    dlltestInitialize();  
07.    mwArray x(10,10,mxDOUBLE_CLASS);  
08.    double *xData;xData = new double[100];  
09.    for(int i=0; i<100; ++i)    xData[i] = -5+(0.1*i);  
10.    x.SetData(xData, 100);  
11.    mwArray y(10,10,mxDOUBLE_CLASS);  
12.    huatu_test(1,y,x);  
13.    dlltestTerminate();  
14.    mclTerminateApplication();  
15.}