Matlab和C++混合编程
生活随笔
收集整理的這篇文章主要介紹了
Matlab和C++混合编程
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1 利用 mexopencv 實現各種數據的轉換
int i = MxArray(prhs[0]).toInt(); double d = MxArray(prhs[0]).toDouble(); bool b = MxArray(prhs[0]).toBool(); std::string s = MxArray(prhs[0]).toString(); cv::Mat mat = MxArray(prhs[0]).toMat(); // For pixels cv::Mat ndmat = MxArray(prhs[0]).toMatND(); // For N-D array cv::Point pt = MxArray(prhs[0]).toPoint(); cv::Size siz = MxArray(prhs[0]).toSize(); cv::Rect rct = MxArray(prhs[0]).toRect(); cv::Scalar sc = MxArray(prhs[0]).toScalar(); cv::SparseMat s = MxArray(prhs[0]).toSparseMat(); // Only double to float plhs[0] = MxArray(i); plhs[0] = MxArray(d); plhs[0] = MxArray(b); plhs[0] = MxArray(s); plhs[0] = MxArray(mat); plhs[0] = MxArray(ndmat); plhs[0] = MxArray(pt); plhs[0] = MxArray(siz); plhs[0] = MxArray(rct); plhs[0] = MxArray(sc); plhs[0] = MxArray(sp); // Only 2D float to double2 Matlab struct/cell to C++
例1 :for struct:
matlab.m 文件中:
調用函數:
res=mex_function(options);mex_function.cpp 文件中:
/* * pm [index].fieldname,因此,options 是一個 1*1 的結構體,故下面的函數中第二個參數為 0 * 其中 pm 是 mxArray *類型。 */ mxArray *mx_name=mxGetField(prhs[0],0,’name’); //下面用兩個方法獲得 name 中的’xlh’: //for mexopencv string str_name=MxArray(mx_name).toString(); //for mx char * str_name= mxArrayToString(mx_name);例2:for cell:
matlab.m 文件中:
調用函數:
res=mex_function(options);mex_function.cpp 文件中:
mxArray *table=mxGetField(prhs[0],0,’table’); //獲取 table 元胞。 mxArray *elem=mxGetCell(table,1);//獲取 table 元胞中的第二個元素,因為 matlab 是按列存儲的,mxGetCell 函數中的 1,表示索引, 多維數組的索引計算參考 matlab 幫助文檔中。 Mat mat=MxArray(elem).toMat();因此:mat 的結果為:[11 12 13 14 15]。注意輸出數據安裝 mat.at輸出,因為 matlab 中
的數字的存儲默認為 double 類型。
3 C++ to Matlab struct/cell
matlab.m 文件中:
table=mex_function(img);//其中 img 是一個圖像.
mex_cpp 文件中;
我們的目的是想實現 C++中的 plhs[0]( 即輸出參數) 傳到 matlab 有如下的形式(即元胞的
形式):
table{1,1}=feature_vector
table{1,2}= feature_vector
…
table{n,n}=feature_vector;
其中 feature_vector 是一個列矢量,也可以是一個圖像矩陣。
mex_cpp 文件中:
mxArray * mx_cell=mxCreateCellMatrix(2,2);//創建2*2大小的cell plhs[0]=mx_cell;//使輸出指向這個cell Mat feature1=(Mat_<double>(1,5)<<1,2,3,4,5); Mat feature2=(Mat_<double>(1,5)<<6,7,8,9,10); Mat feature3=(Mat_<double>(1,5)<<11,12,13,14,15); Mat feature4=(Mat_<double>(1,5)<<16,17,18,19,20); mxArray * mx_feat1=MxArray(feature1);//使用mexopencv實現,也可以使用mx函數實現。 mxArray * mx_feat2=MxArray(feature2); mxArray * mx_feat3=MxArray(feature3); mxArray * mx_feat4=MxArray(feature4); mxSetCell(plhs[0],0,mx_feat1); mxSetCell(plhs[0],1,mx_feat2); mxSetCell(plhs[0],2,mx_feat3); mxSetCell(plhs[0],3,mx_feat4);注釋:
Matlab和C++的接口信息都可以通過下面的方式查詢:
| Data Types | 數據類型 |
| Create or Delete Array | 創建/刪除數組 |
| Validate Data | 檢驗數據的類型/有效性 |
| Access Data | 訪問數據 |
| Convert Data Types | 轉換數據類型 |
轉載于:https://www.cnblogs.com/raby/p/5886702.html
總結
以上是生活随笔為你收集整理的Matlab和C++混合编程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Datepicker
- 下一篇: DELPHI跨平台的临界替代者