matlab调用c函数语言,MATLAB调用C/C++函数的方法
8種機械鍵盤軸體對比
本人程序員,要買一個寫代碼的鍵盤,請問紅軸和茶軸怎么選?
通過MATLAB將C/C++函數編譯成MEX函數,在MATLAB中就可以調用了。
1,首先裝編譯器
Matlab里鍵入mex -setup,選擇你要編譯C++的編譯器
2,寫C++函數
函數的形式必須是
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
nlhs:輸出參數個數
plhs:輸出參數列表
nrhs:輸入參數個數
prhs:輸入參數列表
,不過函數名可以隨便取的。注意:保存的文件名就是將來在MATLAB中調用的函數名,而不是這里的函數名。
下面給出一個例子,目的是想截取數組的部分元素組成新的數組
輸入參數3個,目標數組,截取的行(向量),截取的列(向量)
輸出參數2個,截取后數組,數組維數信息
在函數中展示了如何傳入傳出參數,以及如果從參數列表中取出每一個參數,MATLAB數據和C++數據的互相轉換,還有一些輸出函數等。
新建一個ResizeArray.cpp文件(ResizeArray將作為MATLAB調用的函數名),寫入下面代碼#include "mex.h"
//author: 汪幫主 2010.05.05
//MATLAB調用形式: [resizedArr, resizedDims] = ResizeArray(arr, selRows, sekCols)
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
if (nrhs != 3)
{
mexErrMsgTxt("參數個數不正確!");
}
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("行參數不正確!");
}
int selRowsNum = selRowsRowNum*selRowsColNum;
int selColsRowNum = mxGetM(prhs[2]);
int selColsColNum = mxGetN(prhs[2]);
if (selColsRowNum!=1 && selColsColNum!=1)
{
mexErrMsgTxt("列參數不正確!");
}
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]);
//這里因為MATLAB中數據得按列優先
#define ARR(row,col) pArr[(col)*rowNum+row]
#define RARR(row,col) pResizedArr[(col)*selRowsNum+row]
for(int ri=0; ri
{
for(int ci=0; ci
{
RARR(ri,ci)=ARR((int)pSelRows[ri]-1,(int)pSelCols[ci]-1);
}
}
mexPrintf("OK!n");
}
3,編譯C++函數為MEX函數
將ResizeArray.cpp放在MATLAB當前目錄中,在MATLAB中輸入mex ResizeArray.cpp,編譯成功后將會生成ResizeArray.mexW32
4,調用函數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中數據:
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中數據:
12 13 14 15 19
32 33 34 35 39
rdims為:
2
5
OK,done!
新人創作打卡挑戰賽發博客就能抽獎!定制產品紅包拿不停!總結
以上是生活随笔為你收集整理的matlab调用c函数语言,MATLAB调用C/C++函数的方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: EOS
- 下一篇: Ubuntu 开机出现 grub res