最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++的matlab接口轉(zhuǎn)換方法詳解

 更新時(shí)間:2022年03月30日 11:17:56   作者:菜鳥(niǎo)小白進(jìn)化ing  
這篇文章主要為大家詳細(xì)介紹了C++的matlab接口轉(zhuǎn)換方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助

由于matlab的運(yùn)算速度較慢,因此常常需要使用c++對(duì)關(guān)鍵部分進(jìn)行運(yùn)算。Matlab針對(duì)這一需求提供了相應(yīng)的api方便參數(shù)傳遞以及封裝。

這里使用的vs工程,對(duì)文件進(jìn)行修改生成.mexw64文件,對(duì)于matlab可識(shí)別的文件。

這里的操作都是針對(duì)vs進(jìn)行配置和操作。

一.工程配置

1.配置生成文件

右鍵->屬性->常規(guī)->配置類型 動(dòng)態(tài)庫(kù)(.dll)

右鍵->屬性->高級(jí)->目標(biāo)文件擴(kuò)展名 .mexw64

2.配置附加目錄

右鍵->屬性->c++->附加包含目錄  添加$(Matlab_Dir)\extern\include; 

其中$(Matlab_Dir)為matlab安裝地址

右鍵->屬性->鏈接器->附加庫(kù)目錄 添加$(Matlab_Dir)\extern\lib\win64\microsoft;;

其中$(Matlab_Dir)為matlab安裝地址

3.添加附加依賴項(xiàng)

右鍵->屬性->鏈接器->輸入->附加依賴項(xiàng)

輸入libmx.lib;libmex.lib;libmat.lib;libeng.lib;

二.接口編寫(xiě)

1.添加頭文件

#include "mex.h"是matlab提供的頭文件,利用提供的api進(jìn)行接口函數(shù)編寫(xiě)

2.接口函數(shù)編寫(xiě)

入口過(guò)程的名稱必須是mexFunction,并且包含四個(gè)參數(shù)

void mexFunction(int nlhs, mxArray* plhs[], int nrhs, const mxArray* prhs[]);

nlhs 輸出參數(shù)個(gè)數(shù),plhs 輸出參數(shù)指針 

nrhs 輸入?yún)?shù)個(gè)數(shù),prhs 輸入?yún)?shù)指針 

注意: 輸出和輸入?yún)?shù)的操作都是通過(guò)指針的方式進(jìn)行的。MATLAB可以通過(guò)這些指針,訪問(wèn)內(nèi)存中的數(shù)據(jù)。

3.輸入?yún)?shù)獲取

接口過(guò)程要把參數(shù)傳遞給計(jì)算過(guò)程,還需要從prhs中讀出矩陣的信息,這就要用到下面的mx-函數(shù)和mex-函數(shù)。

  • mxGetM(prhs[0]); 獲取其行數(shù)
  • mxGetN(prhs[0]); 獲取其列數(shù)
  • mxGetNumberOfDimensions(prhs[0]);獲取其維度

主要介紹的是數(shù)據(jù)獲取的兩個(gè)函數(shù) mxGetData 和 mxGetPr。

mxGetData返回值為void類型的指針,必須轉(zhuǎn)換為正確數(shù)據(jù)類型的指針的指針。

mxGetPr返回值為double類型的指針,可以理解為它會(huì)自動(dòng)轉(zhuǎn)換 mxGetData的輸出作為double指針。

在使用上這兩種都可以獲取參數(shù)內(nèi)容。

還有一點(diǎn)需要注意的是,無(wú)法對(duì)未獲取的值進(jìn)行操作。

下面的代碼在調(diào)試時(shí)會(huì)報(bào)錯(cuò),無(wú)法對(duì)于未保存的變量進(jìn)行操作。

Number = ((double*)mxGetData(mxGetCell(prhs[0], 19)))[0]-1;

4.出錯(cuò)信息發(fā)布函數(shù)mexErrMsgTxt,mexWarnMsgTxt

兩函數(shù)的具體格式如下:

#include "mex.h"

void mexErrMsgTxt(const char *error_msg);

void mexWarnMsgTxt(const char *warning_msg);

其中error_msg包含了要顯示錯(cuò)誤信息,warning_msg包含要顯示的警告信息。兩函數(shù)的區(qū)別在于mexErrMsgTxt顯示出錯(cuò)信息后即返回到MATLAB,而mexWarnMsgTxt顯示警告信息后繼續(xù)執(zhí)行。

5.輸出參數(shù)設(shè)置

對(duì)于程序的返回結(jié)果需要將其保存在plhs指針當(dāng)中,而且保存在plhs的返回指針類型必須是mxArray。

這里介紹兩個(gè)api進(jìn)行數(shù)組,矩陣的創(chuàng)建。由于常用的數(shù)據(jù)類型為double,這里列舉的均為double類型的數(shù)組。

plhs[0] = mxCreateNumericArray(3, dims,mxDOUBLE_CLASS, mxREAL);
plhs[1] = mxCreateDoubleMatrix(n, n, mxREAL);    

6.參數(shù)轉(zhuǎn)置

由于matlab的數(shù)據(jù)存儲(chǔ)順序與c++不同,因此在數(shù)據(jù)輸入時(shí)需要對(duì)數(shù)據(jù)進(jìn)行轉(zhuǎn)換。在數(shù)據(jù)輸出傳遞的時(shí)候,同樣也需要對(duì)數(shù)組進(jìn)行轉(zhuǎn)換。

matlab對(duì)于數(shù)組存儲(chǔ)是按照列進(jìn)行保存的,而c++是按照行進(jìn)行保存,因此在數(shù)據(jù)計(jì)算時(shí)需要格外注意。

這里是常用的行列轉(zhuǎn)換的代碼。

template <class T1, class T2>
void cTranspose3d(T1* dst, T2* src, int srcRow, int srcCol, int channel)
{
	int i = 0, k = 0;
	T1* dst1 = NULL;
	T2* src1 = NULL;
	for (k = 0; k < channel; k++)
	{
		dst1 = dst + k * srcRow * srcCol;
		src1 = src + k * srcRow * srcCol;
		for (i = 0; i < srcRow * srcCol; i++)
		{
			dst1[i] = src1[(i % srcRow) * srcCol + (i / srcRow)];//th/ srcRow//src's  col -> dst's row,th%srcRow//src's   row -> dst's col
		}
	}
}

總結(jié)

至此整個(gè)接口書(shū)寫(xiě)就結(jié)束了。該篇教程也是記錄一下自己整個(gè)學(xué)習(xí)過(guò)程,希望能夠看的人一點(diǎn)點(diǎn)幫助。

相關(guān)文章

最新評(píng)論

林口县| 崇仁县| 上思县| 大邑县| 竹溪县| 甘洛县| 商都县| 蕲春县| 渭源县| 长乐市| 大英县| 仁布县| 霍林郭勒市| 文山县| 涿鹿县| 乌兰察布市| 雷波县| 临沧市| 册亨县| 海淀区| 波密县| 荆门市| 临湘市| 启东市| 沧源| 开封县| 靖宇县| 大同县| 玉田县| 双柏县| 安阳市| 隆子县| 南雄市| 会昌县| 阿勒泰市| 寻甸| 织金县| 安庆市| 柏乡县| 永康市| 沐川县|