记录一次使用C++与matlab混合编程经历
C++以其卓越的运行性能而著称,因此我们选择采用C++编写复杂的运算逻辑,以提高程序执行效率,从而有效缩短运行时间。而Matlab则拥有丰富的数值处理库函数,通过充分发挥两者的优势,我们能够实现更为全面和高效的编程。
一、VS的配置准备
首先需要对Visual studio进行配置
1.创建空项目
- 配置项目的属性
二、 matlab的配置准备
打开matlab,在命令行输入mex -setup C++,初始化matlab
三、代码编写
1.整体代码如下
# include "mex.h"
# include <fftw3.h>
// 入口
void mexFunction(int nlhs, mxArray* plhs[],
int nrhs, const mxArray* prhs[]) {
// 检查参数个数
if (nrhs != 2)
mexErrMsgIdAndTxt("MATLAB:CrossCorrelationAndFindDelay:invalidNumInputs",
"Two inputs required.");
if (nlhs > 1)
mexErrMsgIdAndTxt("MATLAB:CrossCorrelationAndFindDelay:maxlhs",
"Too many output arguments.");
// 检查输入是否是向量
if (mxGetM(prhs[0]) != 1 || mxGetM(prhs[1]) != 1)
mexErrMsgIdAndTxt("MATLAB:CrossCorrelationAndFindDelay:inputsNotVectors",
"Both inputs must be row vectors.");
// 检查输入是否是复数
if (!mxIsComplex(prhs[0]) || !mxIsComplex(prhs[1]))
mexErrMsgIdAndTxt("MATLAB:CrossCorrelationAndFindDelay:inputsNotComplex",
"Inputs must be complex.\n");
size_t rows, cols;
size_t nx, ny;
// 得到两组数组的大小
nx = mxGetN(prhs[0]);
ny = mxGetN(prhs[1]);
// 检查两组数组大小是否相同
if (nx != ny) {
mexErrMsgIdAndTxt("MATLAB:CrossCorrelationAndFindDelay:inputsLengthNotEqual",
"Inputs must have equal length.\n");
}
rows = 1;
cols = 2 * nx - 1;
// 进行计算
// size_t lag = CrossCorrelationAndFindDelay(prhs[0], prhs[1], nx);
double lag = CrossCorrelationWithFFT(prhs[0], prhs[1], nx);
mxArray* outputMatrix = mxCreateNumericMatrix(1, 1, mxDOUBLE_CLASS, mxREAL);
double* matrixData = (double*)mxGetData(outputMatrix);
matrixData[0] = lag;
plhs[0] = outputMatrix;
return;
}
2.入口函数
首先需要引入# include "mex.h"
类似于main函数,是程序执行的入口。
void mexFunction(int nlhs, mxArray* plhs[],int nrhs, const mxArray* prhs[])
nlhs
:这是一个整数参数,表示左侧输出参数(output arguments)的数量。plhs[]
:这是一个指向指针数组的指针,用于存储左侧输出参数的地址。plhs
指针数组的长度由nlhs
参数指定。每个输出参数都是 mxArray 类型的指针,它是 MATLAB 中用于表示数组和矩阵的数据结构。nrhs
:这是一个整数参数,表示右侧输入参数(input arguments)的数量。类似于nlhs
。prhs[]
:这是一个指向指针数组的指针,用于存储右侧输入参数的地址。prhs
指针数组的长度由nrhs
参数指定。
3.返回值
如我的函数只需要返回一个 double
变量的值,首先创建一个 mxDOUBLE_CLASS
类型的矩阵,将其转换为 double
类型,并将计算结果赋值给该变量。最后,通过将 plhs[0]
指向您的 outputMatrix
的值,实现对输出参数的赋值。如果有多个值需要返回,可以采用相同的方法对 plhs[1]
、plhs[2]
等进行赋值。
mxArray* outputMatrix = mxCreateNumericMatrix(1, 1, mxDOUBLE_CLASS, mxREAL);
double* matrixData = (double*)mxGetData(outputMatrix);
matrixData[0] = lag;
plhs[0] = outputMatrix;
总的来说,通过入口函数获取Matlab的参数输入,进行计算后,通过复制对 plhs
指向的数据结构进行操作,成功实现了一次输入到输出的映射。在这个过程中,计算阶段可以利用C++编程方式进行实现,以达到较高的执行效率。
4.归纳
总的来说,通过入口函数获取Matlab的参数输入,进行计算后,通过复制对 plhs
指向的数据结构进行操作,成功实现了一次输入到输出的映射。在这个过程中,计算阶段可以利用C++编程方式进行实现,以达到较高的执行效率。
四、总结
由于我需要使用fftw库进行编程,因此我需要在Visual Studio中进行编译。如果程序没有使用额外的库,可以直接在Matlab的命令窗口中进行编译,这样就无需配置Visual Studio,更加方便。需要注意的是,使用到的.dll文件需要复制到.mexw64C文件的同级目录中。这样,我们就能够直接调用该函数(函数名即为mexw64C文件的名称)进行编程。