我想在C++中構建一個DLL,並使用loadlibrary
和calllib
指令從MATLAB調用它。它適用於一個值,它通常返回一個值,但現在我試圖從C++ DLL到MATLAB作爲函數的輸出返回整個數組。返回數組從C++ dll到matlab
你知道C++通常返回數組的指針,但這不MATLAB工作... 我搜索,在互聯網,他們使用的是一些MEX功能,但目前尚不清楚...
你能解釋一下如何從C++ DLL返回一個數組到MATLAB calllib
,我們應該如何從C++代碼返回它?
我想在C++中構建一個DLL,並使用loadlibrary
和calllib
指令從MATLAB調用它。它適用於一個值,它通常返回一個值,但現在我試圖從C++ DLL到MATLAB作爲函數的輸出返回整個數組。返回數組從C++ dll到matlab
你知道C++通常返回數組的指針,但這不MATLAB工作... 我搜索,在互聯網,他們使用的是一些MEX功能,但目前尚不清楚...
你能解釋一下如何從C++ DLL返回一個數組到MATLAB calllib
,我們應該如何從C++代碼返回它?
考慮暴露下面的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,修改後的數組將作爲輸出返回(因爲內置類型不會就地修改)。
您也可以編寫該函數,以便分配內存本身。有關示例,請參見[這裏](http://stackoverflow.com/a/7446744/97160)(適用於字符串,但概念相似)。此外,作爲替代方案,您可以編寫一個MEX函數來封裝C/C++ DLL,而不是使用'loadlibrary'方法 – Amro
非常感謝您... 我可以將它應用於2d數組嗎? (實際上我是c程序員,對matlab我不太瞭解......但是這是工作:)) – user130227
@ user130227:很容易嘗試,嘗試調用上述:'x = calllib ('mydll','getData',零(2,5),10)'......所以它適用於任何維數組,只要記住MATLAB使用[column-major order](https://en.wikipedia .ORG /維基/列-major_order#列的major_order)。即使不是這樣,你總是可以傳遞扁平的一維數組,然後在MATLAB中將結果重塑爲二維矩陣 – Amro
我認爲這是不同的或者我不明白它... – user130227
謝謝你的答覆 我試圖返回一個指針一倍,但沒有奏效 請寫一行代碼,所以我能理解應該如何工作的功能... 也我直接從dll庫調用這個函數,而不是從mex直接... – user130227
@EitanT:我認爲OP正試圖使用'loadlibrary',而不是寫一個MEX函數。儘管這是一個可行的選擇,也可以與C/C++ – Amro