網(wǎng)站首頁 編程語言 正文
由于matlab的運算速度較慢,因此常常需要使用c++對關鍵部分進行運算。Matlab針對這一需求提供了相應的api方便參數(shù)傳遞以及封裝。
這里使用的vs工程,對文件進行修改生成.mexw64文件,對于matlab可識別的文件。
這里的操作都是針對vs進行配置和操作。
一.工程配置
1.配置生成文件
右鍵->屬性->常規(guī)->配置類型?動態(tài)庫(.dll)
右鍵->屬性->高級->目標文件擴展名?.mexw64
2.配置附加目錄
右鍵->屬性->c++->附加包含目錄? 添加$(Matlab_Dir)\extern\include;?
其中$(Matlab_Dir)為matlab安裝地址
右鍵->屬性->鏈接器->附加庫目錄 添加$(Matlab_Dir)\extern\lib\win64\microsoft;;
其中$(Matlab_Dir)為matlab安裝地址
3.添加附加依賴項
右鍵->屬性->鏈接器->輸入->附加依賴項
輸入libmx.lib;libmex.lib;libmat.lib;libeng.lib;
二.接口編寫
1.添加頭文件
#include "mex.h"是matlab提供的頭文件,利用提供的api進行接口函數(shù)編寫
2.接口函數(shù)編寫
入口過程的名稱必須是mexFunction,并且包含四個參數(shù)
void mexFunction(int nlhs, mxArray* plhs[], int nrhs, const mxArray* prhs[]);
nlhs?輸出參數(shù)個數(shù),plhs 輸出參數(shù)指針?
nrhs 輸入?yún)?shù)個數(shù),prhs 輸入?yún)?shù)指針?
注意:?輸出和輸入?yún)?shù)的操作都是通過指針的方式進行的。MATLAB可以通過這些指針,訪問內存中的數(shù)據(jù)。
3.輸入?yún)?shù)獲取
接口過程要把參數(shù)傳遞給計算過程,還需要從prhs中讀出矩陣的信息,這就要用到下面的mx-函數(shù)和mex-函數(shù)。
-
mxGetM(prhs[0]);
獲取其行數(shù) -
mxGetN(prhs[0]);?
獲取其列數(shù) -
mxGetNumberOfDimensions(prhs[0]);
獲取其維度
主要介紹的是數(shù)據(jù)獲取的兩個函數(shù)?mxGetData?和?mxGetPr。
mxGetData
:?返回值為void類型的指針,必須轉換為正確數(shù)據(jù)類型的指針的指針。
mxGetPr
:返回值為double類型的指針,可以理解為它會自動轉換?mxGetData的輸出作為double指針。
在使用上這兩種都可以獲取參數(shù)內容。
還有一點需要注意的是,無法對未獲取的值進行操作。
下面的代碼在調試時會報錯,無法對于未保存的變量進行操作。
Number = ((double*)mxGetData(mxGetCell(prhs[0], 19)))[0]-1;
4.出錯信息發(fā)布函數(shù)mexErrMsgTxt,mexWarnMsgTxt
兩函數(shù)的具體格式如下:
#include "mex.h"
void mexErrMsgTxt(const char *error_msg);
void mexWarnMsgTxt(const char *warning_msg);
其中error_msg包含了要顯示錯誤信息,warning_msg包含要顯示的警告信息。兩函數(shù)的區(qū)別在于mexErrMsgTxt顯示出錯信息后即返回到MATLAB,而mexWarnMsgTxt顯示警告信息后繼續(xù)執(zhí)行。
5.輸出參數(shù)設置
對于程序的返回結果需要將其保存在plhs指針當中,而且保存在plhs的返回指針類型必須是mxArray。
這里介紹兩個api進行數(shù)組,矩陣的創(chuàng)建。由于常用的數(shù)據(jù)類型為double,這里列舉的均為double類型的數(shù)組。
plhs[0] = mxCreateNumericArray(3, dims,mxDOUBLE_CLASS, mxREAL); plhs[1] = mxCreateDoubleMatrix(n, n, mxREAL);
6.參數(shù)轉置
由于matlab的數(shù)據(jù)存儲順序與c++不同,因此在數(shù)據(jù)輸入時需要對數(shù)據(jù)進行轉換。在數(shù)據(jù)輸出傳遞的時候,同樣也需要對數(shù)組進行轉換。
matlab對于數(shù)組存儲是按照列進行保存的,而c++是按照行進行保存,因此在數(shù)據(jù)計算時需要格外注意。
這里是常用的行列轉換的代碼。
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 } } }
總結
原文鏈接:https://blog.csdn.net/ltd0924/article/details/123817651
相關推薦
- 2022-03-12 Nginx熱部署的實現(xiàn)_nginx
- 2023-04-02 Flutter應用Windows平臺接入實踐詳解_C 語言
- 2022-09-12 C++實例分析組合數(shù)的計算與排列組合的產(chǎn)生_C 語言
- 2022-04-22 arm-linux使用qt開發(fā)并加入openssl
- 2022-12-04 關于SQL查詢語句關鍵字方法_MsSql
- 2022-11-04 詳解Pytorch中的tensor數(shù)據(jù)結構_python
- 2024-04-07 mybatis-plus插入數(shù)據(jù)庫值無效(插入不對,沒有插入數(shù)據(jù)庫默認值,int的類型的null會變
- 2021-12-07 c++代碼各種注釋示例詳解_C 語言
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細win安裝深度學習環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結構-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支