日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > c/c++ >内容正文

c/c++

Matlab和C++混合编程

發(fā)布時(shí)間:2023/12/2 c/c++ 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Matlab和C++混合编程 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1 利用 mexopencv 實(shí)現(xiàn)各種數(shù)據(jù)的轉(zhuǎn)換

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 double

2 Matlab struct/cell to C++

例1 :for struct:
matlab.m 文件中:

options.name=’xlh’; options.age=25; options.arr=[10 20 30;5 6 7];

調(diào)用函數(shù):

res=mex_function(options);

mex_function.cpp 文件中:

/* * pm [index].fieldname,因此,options 是一個(gè) 1*1 的結(jié)構(gòu)體,故下面的函數(shù)中第二個(gè)參數(shù)為 0 * 其中 pm 是 mxArray *類(lèi)型。 */ mxArray *mx_name=mxGetField(prhs[0],0,’name’); //下面用兩個(gè)方法獲得 name 中的’xlh’: //for mexopencv string str_name=MxArray(mx_name).toString(); //for mx char * str_name= mxArrayToString(mx_name);

例2:for cell:
matlab.m 文件中:

opt_param.table{1,1}=[1 2 3 4 5]; opt_param.table{1,2}=[6 7 8 9 10]; opt_param.table{2,1}=[11 12 13 14 15]; opt_param.table{2,2}=[16 17 18 19 20];

調(diào)用函數(shù):

res=mex_function(options);

mex_function.cpp 文件中:

mxArray *table=mxGetField(prhs[0],0,’table’); //獲取 table 元胞。 mxArray *elem=mxGetCell(table,1);//獲取 table 元胞中的第二個(gè)元素,因?yàn)?matlab 是按列存儲(chǔ)的,mxGetCell 函數(shù)中的 1,表示索引, 多維數(shù)組的索引計(jì)算參考 matlab 幫助文檔中。 Mat mat=MxArray(elem).toMat();

因此:mat 的結(jié)果為:[11 12 13 14 15]。注意輸出數(shù)據(jù)安裝 mat.at輸出,因?yàn)?matlab 中
的數(shù)字的存儲(chǔ)默認(rèn)為 double 類(lèi)型。

3 C++ to Matlab struct/cell

matlab.m 文件中:

table=mex_function(img);//其中 img 是一個(gè)圖像.
mex_cpp 文件中;
我們的目的是想實(shí)現(xiàn) C++中的 plhs[0]( 即輸出參數(shù)) 傳到 matlab 有如下的形式(即元胞的
形式):
table{1,1}=feature_vector
table{1,2}= feature_vector

table{n,n}=feature_vector;
其中 feature_vector 是一個(gè)列矢量,也可以是一個(gè)圖像矩陣。

mex_cpp 文件中:

mxArray * mx_cell=mxCreateCellMatrix(2,2);//創(chuàng)建2*2大小的cell plhs[0]=mx_cell;//使輸出指向這個(gè)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實(shí)現(xiàn),也可以使用mx函數(shù)實(shí)現(xiàn)。 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++的接口信息都可以通過(guò)下面的方式查詢:

matlab->Advanced Software Development->MATLAB API for Other Languages->C/C++ Matrix Libray API API描述
Data Types數(shù)據(jù)類(lèi)型
Create or Delete Array創(chuàng)建/刪除數(shù)組
Validate Data檢驗(yàn)數(shù)據(jù)的類(lèi)型/有效性
Access Data訪問(wèn)數(shù)據(jù)
Convert Data Types轉(zhuǎn)換數(shù)據(jù)類(lèi)型

轉(zhuǎn)載于:https://www.cnblogs.com/raby/p/5886702.html

總結(jié)

以上是生活随笔為你收集整理的Matlab和C++混合编程的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。