Matlab調用C++代碼的具體mex實現詳解

在這裏記錄一下自己的挖坑、填坑過程。從mex環境到與成功調用

在具體的實現中,由於matlab具有很強的矩陣運算能力。而對於處理太多的循環結構運算卻顯得很喫力。所以在具體的實現中,我們可以在Matlab中調用其他語言的程序來達到最高效率的實現。這裏我主要是是matlab來調用寫好的C++代碼爲例。當然這也完全使用C語言的代碼調用實現。

一、首先,我們需要有自己的編程環境,我的是matlab2017+MinGW-w64 C/C++ 編譯器。由於自己的VS2015環境不能被matlab識別。(原因多半是Matlab和VS2015的 安裝順序有關:先安裝VS之後再安裝Matlab)。關於Matlab的安裝這裏就不贅述,百度自己解決。

1.MinGW-w64 C/C++編譯器的安裝,在matlab中雖然附加功能管理器可以安裝,但是速度慢的驚人。我們可以直接到網上下載安裝。這個TDM-GCC-64’搜索下載去吧!記得w64需要5.3的版本才能在matlab2017B中支持。(這裏可以用5.3的安裝文件來 覆蓋TDM-GCC-64’文件達到)

2.安裝之後重啓Matlab,進入之後在命令行中輸入mex -setup安裝編譯器,這時默認是C的編譯環境。可選擇mex -setup C++的選項;

以上就完成了環境的搭建配置。這一過程問題很多。慢慢摸索。

二、以下是我們的關鍵部分,對 C++代碼的重寫mex主函數入口(mexfunction)重點**
mex調用C++代碼的關鍵過程有重寫原本的main函數,改爲mexfunction();該函數是matlab調用的主要入口。如果不重寫 會報錯如下:LINK : error LNK2001: 無法解析的外部符號 mexFunction
這裏寫圖片描述
該主函數的形式如下:

**“`

include “mex.h”

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


必須添加include行的“”mex.h“”
四個參數分別用來輸出和輸入數據: nlhs(left hand side) 是輸出參數個數,plhs 是輸出參數指針;nrhs (right hand side)是輸入參數個數,prhs 是輸入參數指針。(想象成一個賦值等式:a = b+c)b和c是需要輸入的自變量位於右邊
注意: 對輸出和輸入參數的操作都是通過指針的方式進行的。
**操作輸入數據**
對輸入數據進行操作,需要通過MEX函數mxGetPr 得到數據的指針地址。 mxGetM 和 mxGetN 得到矩陣數據的行和列 (返回整數)。對於實矩陣,我們可以定義 double *M; 來對實矩陣數據操作。如:

double *M;
int m,n;
//指針指向第一個參數的數據地址
M = mxGetPr(prhs[0]);
m = mxGetM(prhs[0]);//獲取行
n = mxGetN(prhs[0]);//獲取列

**操作輸出數據
對於輸出數據,需要首先用專門的mex函數分配內存空間,如:**

plhs[0] = mxCreateDoubleMatrix(m,n, mxINT32_CLASS,mxREAL); //生成m x n 的實矩陣

同輸入數據一樣,要對輸出數據操作,我們也需要一個指向數據的指針變量,如

double *A;
A = mxGetPr(plhs[0]);


**三、下面以一個網上的例子來說明**

include “mex.h”

void timestwo_alt(double *y, double x)
{
*y = 2.0*x;
}

void mexFunction ( int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[] )
{
double *M;
int m,n; //指針指向第一個參數的數據地址
M = mxGetPr(prhs[0]);
m = mxGetM(prhs[0]);
n = mxGetN(prhs[0]);

plhs[0] = mxCreateDoubleMatrix(m,n, mxINT32_CLASS,mxREAL); //生成m x n 的實矩陣,分配內存空間
double *A;
A = mxGetPr(plhs[0]);

timestwo_alt(A,*M);     //調用並直接賦值到指針指向的輸出變量

}
“`
MEX的編譯
如編譯鏈接C語言的MEX文件源程序,在MATLAB的控制窗口中輸入:mex timestwoalt.c生成一個名爲timestwoalt.mexw64的MEX文件

MEX的編譯編輯
如編譯鏈接C語言的MEX文件源程序,在MATLAB的控制窗口中輸入:mex timestwoalt.c生成一個名爲timestwoalt.mexw32的MEX文件

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章