记录一次使用C++与matlab混合编程经历

本文详细描述了如何在C++和Matlab间进行混合编程,包括VisualStudio的配置、Matlab接口函数的编写,以及利用C++进行复杂运算以提高程序效率的过程。
摘要由CSDN通过智能技术生成

记录一次使用C++与matlab混合编程经历

C++以其卓越的运行性能而著称,因此我们选择采用C++编写复杂的运算逻辑,以提高程序执行效率,从而有效缩短运行时间。而Matlab则拥有丰富的数值处理库函数,通过充分发挥两者的优势,我们能够实现更为全面和高效的编程。

一、VS的配置准备

首先需要对Visual studio进行配置

1.创建空项目

在这里插入图片描述

  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[])

  1. nlhs:这是一个整数参数,表示左侧输出参数(output arguments)的数量。
  2. plhs[]:这是一个指向指针数组的指针,用于存储左侧输出参数的地址。plhs 指针数组的长度由 nlhs 参数指定。每个输出参数都是 mxArray 类型的指针,它是 MATLAB 中用于表示数组和矩阵的数据结构。
  3. nrhs:这是一个整数参数,表示右侧输入参数(input arguments)的数量。类似于 nlhs
  4. 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文件的名称)进行编程。

  • 23
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值