2013-09-01 84 views
3

我想在C++中構建一個DLL,並使用loadlibrarycalllib指令從MATLAB調用它。它適用於一個值,它通常返回一個值,但現在我試圖從C++ DLL到MATLAB作爲函數的輸出返回整個數組。返回數組從C++ dll到matlab

你知道C++通常返回數組的指針,但這不MATLAB工作... 我搜索,在互聯網,他們使用的是一些MEX功能,但目前尚不清楚...

你能解釋一下如何從C++ DLL返回一個數組到MATLAB calllib,我們應該如何從C++代碼返回它?

+0

我認爲這是不同的或者我不明白它... – user130227

+0

謝謝你的答覆 我試圖返回一個指針一倍,但沒有奏效 請寫一行代碼,所以我能理解應該如何工作的功能... 也我直接從dll庫調用這個函數,而不是從mex直接... – user130227

+0

@EitanT:我認爲OP正試圖使用​​'loadlibrary',而不是寫一個MEX函數。儘管這是一個可行的選擇,也可以與C/C++ – Amro

回答

5

考慮暴露下面的C函數的DLL:

void getData(double *x, const int len) 
{ 
    for(int i=0; i<len; i++) { 
     x[i] = i; 
    } 
} 

它帶有一個數組已經分配的長度,和與增量值填充。

在MATLAB中,首先我們load the library

>> loadlibrary('mydll.dll', 'mydll.h') 
>> libfunctions mydll -full 

Functions in library mydll: 

doublePtr getData(doublePtr, int32) 

要調用該暴露的功能,我們使用libpointer

>> p = libpointer('doublePtr', zeros(1,10)) % initialize array of 10 elements 
p = 
libpointer 
>> get(p) 
     Value: [0 0 0 0 0 0 0 0 0 0] 
    DataType: 'doublePtr' 
>> calllib('mydll', 'getData', p, 10)  % call C function 
>> get(p) 
     Value: [0 1 2 3 4 5 6 7 8 9] 
    DataType: 'doublePtr' 

我們也可以簡單地通過定期的載體和MATLAB會照顧編組:

>> x = calllib('mydll', 'getData', zeros(1,10), 10) 
x = 
    0  1  2  3  4  5  6  7  8  9 

請注意,在this case,修改後的數組將作爲輸出返回(因爲內置類型不會就地修改)。

+0

您也可以編寫該函數,以便分配內存本身。有關示例,請參見[這裏](http://stackoverflow.com/a/7446744/97160)(適用於字符串,但概念相似)。此外,作爲替代方案,您可以編寫一個MEX函數來封裝C/C++ DLL,而不是使用'loadlibrary'方法 – Amro

+0

非常感謝您... 我可以將它應用於2d數組嗎? (實際上我是c程序員,對matlab我不太瞭解......但是這是工作:)) – user130227

+0

@ user130227:很容易嘗試,嘗試調用上述:'x = calllib ('mydll','getData',零(2,5),10)'......所以它適用於任何維數組,只要記住MATLAB使用[column-major order](https://en.wikipedia .ORG /維基/列-major_order#列的major_order)。即使不是這樣,你總是可以傳遞扁平的一維數組,然後在MATLAB中將結果重塑爲二維矩陣 – Amro