matlab与C/C++的混合编程

本文介绍如何使用mexFunction实现Matlab与C/C++的混合编程,以提高程序运行效率。详细讲解了mexFunction的编写过程,并演示了一个具体的示例,最后介绍了如何在Visual Studio中调试C/C++代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简述

matlab比较擅长矩阵运算,而运算for的速度较慢,如果将matlab与C或C++进行混合编程,则可以提升程序运行速度。matlab与C/C++的混合编程是通过mexFunction进行的,即在C或C++的源文件中添加一个mexFunction函数,然后通过MX矩阵库和MEX函数库进行编程,我们先来查看matlab给的例子。

mexFunction的编写

#include "mex.h"

void
mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
    mxArray *cell_array_ptr, *rhs[1];
    mwIndex i;

    (void)plhs;    /* unused parameter */

    /* Check for proper number of input and output arguments */    
    if (nrhs < 1) {
        mexErrMsgIdAndTxt( "MATLAB:mxcreatecellmatrix:minrhs",
                "At least one input argument required.");
    } 
    if(nlhs > 1){
        mexErrMsgIdAndTxt( "MATLAB:mxcreatecellmatrix:maxlhs",
                "Too many output arguments.");
    }

    /* Create a nrhs x 1 cell mxArray. */ 
    cell_array_ptr = mxCreateCellMatrix((mwSize)nrhs,1);

    /* Fill cell matrix with input arguments */
    for( i=0; i<(mwIndex)nrhs; i++){
        mxSetCell(cell_array_ptr,i,mxDuplicateArray(prhs[i]));
    }

    rhs[0] = cell_array_ptr;

    /* Call mexCallMATLAB to display the cell */
    mexPrintf("\nThe contents of the created cell is:\n\n");
    mexCallMATLAB(0,NULL,1,rhs,"disp");
}

此示例显示如何使用mxCreateCellMatrix.c函数在MEX文件中创建单元格数组,然后将输入参数放入单元格数组中,并在matlab命令窗口中输出。
首先在代码中引入mex.h头文件,接着编写mexFunction。函数中的四个参数分别表示,输出的个数(left hand side),指向输出变量的mxArray的指针数组,输入的个数(right hand side),指向输入变量的mxArray的指针数组。函数里面的mx和mex开头的类型和方法皆为mx函数库和mex函数库所提供。

VS调试

编写好C/Cpp文件后,将matlab的当前路径切换到C/Cpp所在的文件夹下,然后在命令窗口或脚本文件中输入mex mxcreatecellmatrix.C/Cpp,这样就可以在matlab中调用mxcreatecellmatrix函数,如下图:
这里写图片描述
其中,我们还可以利用VS2010对源文件调试,步骤如下:
1.切换到Cpp文件所在路径,在命令窗口中输入mex -g mxcreatecellmatrix.cpp
2.打开VS2010,选择工具->附加到进程,如下图:
这里写图片描述
3.找到matlab.exe,选中,点击附加
这里写图片描述
注意此时不要关闭matlab.
4.选择文件,打开有mexFunction的CPP文件,然后设置断点
这里写图片描述
5.在matlab的命令窗口中输入:mxcreatecellmatrix(‘123’,’456’),接着就可以采用VS进行调试。
这里写图片描述

mx函数库

这里给出部分mx函数的用途,其余的可自行查看matlab的帮助文档:

函数用途
mxIsUint8确定数组是否将数据表示为无符号8位整数
mxIsDouble确定mxArray是否将数据表示为双精度浮点数
mexErrMsgTxt显示错误消息并返回到MATLAB命令窗
mxGetNumberOfDimensions获取数组中的维数
mxGetDimensions获取指向数组维度的指针
mxGetScalar数组中第一个数据元素的实数组成部分
mxGetData数组中数值数据元素的指针
mxCreateDoubleMatrix创建2维,双精度,浮点数组
mxGetPrDOUBLE类型的数组中的实数数据元素
mxCreateCellMatrix创建二维的元胞数组
mexPrintf在command window和日记中打印字符串(如果日记正在使用中)

参考资料:”http://www.matlabsky.com/thread-27585-1-1.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值