matlab和C如何混编
MATLAB調(diào)用C/C++函數(shù)的方法
|
??? 通過MATLAB將C/C++函數(shù)編譯成MEX函數(shù),在MATLAB中就可以調(diào)用了。
1,首先裝編譯器
Matlab里鍵入mex?-setup,選擇你要編譯C++的編譯器
2,寫C++函數(shù)
函數(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ù)列表
,不過函數(shù)名可以隨便取的。注意:保存的文件名就是將來在MATLAB中調(diào)用的函數(shù)名,而不是這里的函數(shù)名。
下面給出一個(gè)例子,目的是想截取數(shù)組的部分元素組成新的數(shù)組
輸入?yún)?shù)3個(gè),目標(biāo)數(shù)組,截取的行(向量),截取的列(向量)
輸出參數(shù)2個(gè),截取后數(shù)組,數(shù)組維數(shù)信息
在函數(shù)中展示了如何傳入傳出參數(shù),以及如果從參數(shù)列表中取出每一個(gè)參數(shù),MATLAB數(shù)據(jù)和C++數(shù)據(jù)的互相轉(zhuǎn)換,還有一些輸出函數(shù)等。
新建一個(gè)ResizeArray.cpp文件(ResizeArray將作為MATLAB調(diào)用的函數(shù)名),寫入下面代碼
#include "mex.h"?
//author: 汪幫主 2010.05.05
//MATLAB調(diào)用形式: [resizedArr, resizedDims] = ResizeArray(arr, selRows, sekCols)
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])?
{?
??? if (nrhs != 3)
??? {
??????? mexErrMsgTxt("參數(shù)個(gè)數(shù)不正確!");
??? }
????
??? int rowNum = mxGetM(prhs[0]);
??? int colNum = mxGetN(prhs[0]);
??? double* pArr = (double*)mxGetPr(prhs[0]);
??? //得到選擇的行列信息
??? //無論是行向量還是列向量均支持
??? double* pSelRows = (double*)mxGetPr(prhs[1]);
??? double* pSelCols = (double*)mxGetPr(prhs[2]);
??? int selRowsRowNum = mxGetM(prhs[1]);
??? int selRowsColNum = mxGetN(prhs[1]);
??? if (selRowsRowNum!=1 && selRowsColNum!=1)
??? {
??????? mexErrMsgTxt("行參數(shù)不正確!");
??? }
??? int selRowsNum = selRowsRowNum*selRowsColNum;
????
????
??? int selColsRowNum = mxGetM(prhs[2]);
??? int selColsColNum = mxGetN(prhs[2]);
??? if (selColsRowNum!=1 && selColsColNum!=1)
??? {
??????? mexErrMsgTxt("列參數(shù)不正確!");
??? }
??? int selColsNum = selColsRowNum*selColsColNum;
???
??? plhs[1] = mxCreateDoubleMatrix(2, 1, mxREAL);
??? double* resizedDims = (double*)mxGetPr(plhs[1]);
??? resizedDims[0] = selRowsNum;
??? resizedDims[1] = selColsNum;????
?????
??? plhs[0] = mxCreateDoubleMatrix(selRowsNum, selColsNum, mxREAL);
??? double* pResizedArr =(double*)mxGetPr(plhs[0]);
????
??? //這里因?yàn)镸ATLAB中數(shù)據(jù)得按列優(yōu)先
??? #define ARR(row,col) pArr[(col)*rowNum+row]
??? #define RARR(row,col) pResizedArr[(col)*selRowsNum+row]
??? for(int ri=0; ri<selRowsNum; ri++)
??? {
??? ?for(int ci=0; ci<selColsNum; ci++)
??? ?{
??? ??RARR(ri,ci)=ARR((int)pSelRows[ri]-1,(int)pSelCols[ci]-1);
??? ?}
??? }
????
??? mexPrintf("OK!/n");?
}
3,編譯C++函數(shù)為MEX函數(shù)
將ResizeArray.cpp放在MATLAB當(dāng)前目錄中,在MATLAB中輸入mex ResizeArray.cpp,編譯成功后將會(huì)生成ResizeArray.mexW32
4,調(diào)用函數(shù)
arr=[11:19;21:29;31:39;41:49;51:59;61:69];
selRows=[1 3];
selCols=[2:4 5 9];
[rarr,rdims]=ResizeArray(arr,rows,cols);
arr中數(shù)據(jù):
11?12?13?14?15?16?17?18?19
21?22?23?24?25?26?27?28?29
31?32?33?34?35?36?37?38?39
41?42?43?44?45?46?47?48?49
51?52?53?54?55?56?57?58?59
61?62?63?64?65?66?67?68?69
rarr中數(shù)據(jù):
12?13?14?15?19
32?33?34?35?39
rdims為:
2
5
OK,done!
總結(jié)
以上是生活随笔為你收集整理的matlab和C如何混编的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: matlab获取目录中图像名称及路径的递
- 下一篇: 编程艺术 二进制中1的个数