<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
由於matlab的運算速度較慢,因此常常需要使用c++對關鍵部分進行運算。Matlab針對這一需求提供了相應的api方便引數傳遞以及封裝。
這裡使用的vs工程,對檔案進行修改生成.mexw64檔案,對於matlab可識別的檔案。
這裡的操作都是針對vs進行設定和操作。
右鍵->屬性->常規->設定型別 動態庫(.dll)
右鍵->屬性->高階->目標副檔名 .mexw64
右鍵->屬性->c++->附加包含目錄 新增$(Matlab_Dir)externinclude;
其中$(Matlab_Dir)為matlab安裝地址
右鍵->屬性->連結器->附加庫目錄 新增$(Matlab_Dir)externlibwin64microsoft;;
其中$(Matlab_Dir)為matlab安裝地址
右鍵->屬性->連結器->輸入->附加依賴項
輸入libmx.lib;libmex.lib;libmat.lib;libeng.lib;
#include "mex.h"是matlab提供的標頭檔案,利用提供的api進行介面函數編寫
入口過程的名稱必須是mexFunction,並且包含四個引數
void mexFunction(int nlhs, mxArray* plhs[], int nrhs, const mxArray* prhs[]);
nlhs 輸出引數個數,plhs 輸出引數指標
nrhs 輸入引數個數,prhs 輸入引數指標
注意: 輸出和輸入引數的操作都是通過指標的方式進行的。MATLAB可以通過這些指標,存取記憶體中的資料。
介面過程要把引數傳遞給計算過程,還需要從prhs中讀出矩陣的資訊,這就要用到下面的mx-函數和mex-函數。
mxGetM(prhs[0]);
獲取其行數mxGetN(prhs[0]);
獲取其列數mxGetNumberOfDimensions(prhs[0]);
獲取其維度主要介紹的是資料獲取的兩個函數 mxGetData 和 mxGetPr。
mxGetData
: 返回值為void型別的指標,必須轉換為正確資料型別的指標的指標。
mxGetPr
:返回值為double型別的指標,可以理解為它會自動轉換 mxGetData的輸出作為double指標。
在使用上這兩種都可以獲取引數內容。
還有一點需要注意的是,無法對未獲取的值進行操作。
下面的程式碼在偵錯時會報錯,無法對於未儲存的變數進行操作。
Number = ((double*)mxGetData(mxGetCell(prhs[0], 19)))[0]-1;
兩函數的具體格式如下:
#include "mex.h"
void mexErrMsgTxt(const char *error_msg);
void mexWarnMsgTxt(const char *warning_msg);
其中error_msg包含了要顯示錯誤資訊,warning_msg包含要顯示的警告資訊。兩函數的區別在於mexErrMsgTxt顯示出錯資訊後即返回到MATLAB,而mexWarnMsgTxt顯示警告資訊後繼續執行。
對於程式的返回結果需要將其儲存在plhs指標當中,而且儲存在plhs的返回指標型別必須是mxArray。
這裡介紹兩個api進行陣列,矩陣的建立。由於常用的資料型別為double,這裡列舉的均為double型別的陣列。
plhs[0] = mxCreateNumericArray(3, dims,mxDOUBLE_CLASS, mxREAL); plhs[1] = mxCreateDoubleMatrix(n, n, mxREAL);
由於matlab的資料儲存順序與c++不同,因此在資料輸入時需要對資料進行轉換。在資料輸出傳遞的時候,同樣也需要對陣列進行轉換。
matlab對於陣列儲存是按照列進行儲存的,而c++是按照行進行儲存,因此在資料計算時需要格外注意。
這裡是常用的行列轉換的程式碼。
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 } } }
至此整個介面書寫就結束了。該篇教學也是記錄一下自己整個學習過程,希望能夠看的人一點點幫助。
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45