Matlab与C/C++联合编程之Matlab以MEX方式调用C/C++代码(三)

最近写了个Matlab程序,好慢呐……所以开始学习Matlab与C/C++混合编程。下面写了个测试代码,显示一个Double类型矩阵中的元素。

源代码

#include "mex.h"

void displaySubscript( const mxArray *pArray, mwSize index );

// 入口函数
void mexFunction( int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[] ) {
    
    // 源文件名后缀为.c时,所有变量声明必须一次性完成,且放在最前面, 否则mex编译错误
    // 源文件名后缀为.cpp时,没有上面的问题,...- -||
    double *pData;
    mwSize i;
    
    // 输入参数必须为一个,且为double类型
    if ( nrhs != 1 || mxDOUBLE_CLASS != mxGetClassID(prhs[0]) ) {
        mexErrMsgTxt( "输入参数不合法……" );
    }
    
    // 获取数据指针
    pData = mxGetPr(prhs[0]);
    
    // 遍历所有元素并打印到屏幕
    for ( i = 0; i != mxGetNumberOfElements(prhs[0]); i++ ) {
        displaySubscript( prhs[0], i );
        mexPrintf( " = %g/n", pData[i] );
    }
}

void displaySubscript( const mxArray *pArray, mwSize index ) {
    
    // 源文件名后缀为.c时,所有变量声明必须一次性完成,且放在最前面, 否则mex编译错误
    // 源文件名后缀为.cpp时,没有上面的问题,...- -||,代码好龊...
    mwSize i, j;
    mwSize numOfDim;
    mwSize *subScript;
    mwSize subIndex;
    mwSize total;
    
    const mwSize *Dims;
    const char *className;
    
    // 获取维度个数
    numOfDim = mxGetNumberOfDimensions(pArray);
    // 获取维度数组
    Dims = mxGetDimensions(pArray);
    // 获取类型名称
    className = mxGetClassName(pArray);
    // 分配下标数组内存
    subScript = (mwSize *)mxCalloc( numOfDim, sizeof( mwSize ) );
    
    // 根据当前的索引号生成下标
    subIndex = index;
    for ( i = numOfDim - 1; ; i-- ) {
        total = 1;
        
        for ( j = 0; j < i; j++ ) {
            total *= Dims[j];
        }
        
        subScript[i] = subIndex / total;
        subIndex = subIndex % total;
        
        if ( 0 == i ) {
            break;
        }
    }
    
    // 打印出所有下标
    mexPrintf( "(" );
    for ( i = 0; i < numOfDim - 1; i++ ) {
        mexPrintf( "%d,", subScript[i] + 1 );
    }
    mexPrintf( "%d)", subScript[numOfDim-1] + 1 );
    
    // 释放下标数组内存
    mxFree( subScript );
}

在Matlab使用mex命令编译源文件时,要注意这样一个现象:源文件名后缀为.c时,所有变量声明必须一次性完成,且放在最前面, 否则mex编译错误;而源文件名后缀为.cpp时,就没有上面的问题,...- -||。

实验结果

混合编程API一览

MX Matrix Library


mwIndex (C and Fortran)


Type for index values


mwPointer (Fortran)


Pointer type for platform


mwSignedIndex (C and Fortran)


Signed integer type for size values


mwSize (C and Fortran)


Type for size values


mxAddField (C and Fortran)


Field to structure array


mxArray (C and Fortran)


Type for MATLAB array


mxArrayToString (C)


Convert array to string


mxAssert (C)


Check assertion value for debugging purposes


mxAssertS (C)


Check assertion value without printing assertion text


mxCalcSingleSubscript (C and Fortran)


Offset from first element to desired element


mxCalloc (C and Fortran)


Allocate dynamic memory for array using MATLAB memory manager


mxChar (C)


Type for string array


mxClassID (C)


Enumerated value identifying class of array


mxClassIDFromClassName (Fortran)


Identifier corresponding to class


mxComplexity (C)


Flag specifying whether array has imaginary components


mxCopyCharacterToPtr (Fortran)


CHARACTER values from Fortran array to pointer array


mxCopyComplex16ToPtr (Fortran)


COMPLEX*16 values from Fortran array to pointer array


mxCopyComplex8ToPtr (Fortran)


COMPLEX*8 values from Fortran array to pointer array


mxCopyInteger1ToPtr (Fortran)


INTEGER*1 values from Fortran array to pointer array


mxCopyInteger2ToPtr (Fortran)


INTEGER*2 values from Fortran array to pointer array


mxCopyInteger4ToPtr (Fortran)


INTEGER*4 values from Fortran array to pointer array


mxCopyPtrToCharacter (Fortran)


CHARACTER values from pointer array to Fortran array


mxCopyPtrToComplex16 (Fortran)


COMPLEX*16 values from pointer array to Fortran array


mxCopyPtrToComplex8 (Fortran)


COMPLEX*8 values from pointer array to Fortran array


mxCopyPtrToInteger1 (Fortran)


INTEGER*1 values from pointer array to Fortran array


mxCopyPtrToInteger2 (Fortran)


INTEGER*2 values from pointer array to Fortran array


mxCopyPtrToInteger4 (Fortran)


INTEGER*4 values from pointer array to Fortran array


mxCopyPtrToPtrArray (Fortran)


Pointer values from pointer array to Fortran array


mxCopyPtrToReal4 (Fortran)


REAL*4 values from pointer array to Fortran array


mxCopyPtrToReal8 (Fortran)


REAL*8 values from pointer array to Fortran array


mxCopyReal4ToPtr (Fortran)


REAL*4 values from Fortran array to pointer array


mxCopyReal8ToPtr (Fortran)


REAL*8 values from Fortran array to pointer array


mxCreateCellArray (C and Fortran)


Unpopulated N-D cell array


mxCreateCellMatrix (C and Fortran)


Unpopulated 2-D cell array


mxCreateCharArray (C and Fortran)


Unpopulated N-D string array


mxCreateCharMatrixFromStrings (C and Fortran)


Create populated 2-D string array


mxCreateDoubleMatrix (C and Fortran)


2-D, double-precision, floating-point array initialized to 0


mxCreateDoubleScalar (C and Fortran)


Scalar, double-precision array initialized to specified value


mxCreateLogicalArray (C)


N-D logical array initialized to false


mxCreateLogicalMatrix (C)


2-D, logical array initialized to false


mxCreateLogicalScalar (C)


Scalar, logical array


mxCreateNumericArray (C and Fortran)


Unpopulated N-D numeric array


mxCreateNumericMatrix (C and Fortran)


Numeric matrix initialized to 0


mxCreateSparse (C and Fortran)


2-D unpopulated sparse array


mxCreateSparseLogicalMatrix (C)


Unpopulated 2-D, sparse, logical array


mxCreateString (C and Fortran)


Create 1-by-N array initialized to specified string


mxCreateStructArray (C and Fortran)


Unpopulated N-D structure array


mxCreateStructMatrix (C and Fortran)


Unpopulated 2-D structure array


mxDestroyArray (C and Fortran)


Free dynamic memory allocated by MXCREATE* functions


mxDuplicateArray (C and Fortran)


Make deep copy of array


mxFree (C and Fortran)


Free dynamic memory allocated by MXCALLOC, MXMALLOC, or MXREALLOC functions


mxGetCell (C and Fortran)


Contents of array cell


mxGetChars (C)


Pointer to character array data


mxGetClassID (C and Fortran)


Class of array


mxGetClassName (C and Fortran)


Class of array as string


mxGetData (C and Fortran)


Pointer to real data


mxGetDimensions (C and Fortran)


Pointer to dimensions array


mxGetElementSize (C and Fortran)


Number of bytes required to store each data element


mxGetEps (C and Fortran)


Value of EPS


mxGetField (C and Fortran)


Field value, given field name and index, into structure array


mxGetFieldByNumber (C and Fortran)


Field value, given field number and index, into structure array


mxGetFieldNameByNumber (C and Fortran)


Field name, given field number, in structure array


mxGetFieldNumber (C and Fortran)


Field number, given field name, in structure array


mxGetImagData (C and Fortran)


Pointer to imaginary data of array


mxGetInf (C and Fortran)


Value of infinity


mxGetIr (C and Fortran)


Sparse matrix IR array


mxGetJc (C and Fortran)


Sparse matrix JC array


mxGetLogicals (C)


Pointer to logical array data


mxGetM (C and Fortran)


Number of rows in array


mxGetN (C and Fortran)


Number of columns in array


mxGetNaN (C and Fortran)


Value of NaN (Not-a-Number)


mxGetNumberOfDimensions (C and Fortran)


Number of dimensions in array


mxGetNumberOfElements (C and Fortran)


Number of elements in array


mxGetNumberOfFields (C and Fortran)


Number of fields in structure array


mxGetNzmax (C and Fortran)


Number of elements in IR, PR, and PI arrays


mxGetPi (C and Fortran)


Imaginary data elements in array of type DOUBLE


mxGetPr (C and Fortran)


Real data elements in array of type DOUBLE


mxGetProperty (C and Fortran)


Value of public property of MATLAB object


mxGetScalar (C and Fortran)


Real component of first data element in array


mxGetString (C and Fortran)


String array to C-style string


mxIsCell (C and Fortran)


Determine whether input is cell array


mxIsChar (C and Fortran)


Determine whether input is string array


mxIsClass (C and Fortran)


Determine whether array is member of specified class


mxIsComplex (C and Fortran)


Determine whether data is complex


mxIsDouble (C and Fortran)


Determine whether mxArray represents data as double-precision, floating-point numbers


mxIsEmpty (C and Fortran)


Determine whether array is empty


mxIsFinite (C and Fortran)


Determine whether input is finite


mxIsFromGlobalWS (C and Fortran)


Determine whether array was copied from MATLAB global workspace


mxIsInf (C and Fortran)


Determine whether input is infinite


mxIsInt16 (C and Fortran)


Determine whether array represents data as signed 16-bit integers


mxIsInt32 (C and Fortran)


Determine whether array represents data as signed 32-bit integers


mxIsInt64 (C and Fortran)


Determine whether array represents data as signed 64-bit integers


mxIsInt8 (C and Fortran)


Determine whether array represents data as signed 8-bit integers


mxIsLogical (C and Fortran)


Determine whether array is of type mxLogical


mxIsLogicalScalar (C)


Determine whether scalar array is of type mxLogical


mxIsLogicalScalarTrue (C)


Determine whether scalar array of type mxLogical is true


mxIsNaN (C and Fortran)


Determine whether input is NaN (Not-a-Number)


mxIsNumeric (C and Fortran)


Determine whether array is numeric


mxIsSingle (C and Fortran)


Determine whether array represents data as single-precision, floating-point numbers


mxIsSparse (C and Fortran)


Determine whether input is sparse array


mxIsStruct (C and Fortran)


Determine whether input is structure array


mxIsUint16 (C and Fortran)


Determine whether array represents data as unsigned 16-bit integers


mxIsUint32 (C and Fortran)


Determine whether array represents data as unsigned 32-bit integers


mxIsUint64 (C and Fortran)


Determine whether array represents data as unsigned 64-bit integers


mxIsUint8 (C and Fortran)


Determine whether array represents data as unsigned 8-bit integers


mxLogical (C)


Type for logical array


mxMalloc (C and Fortran)


Allocate dynamic memory using MATLAB memory manager


mxRealloc (C and Fortran)


Reallocate dynamic memory using MATLAB memory manager


mxRemoveField (C and Fortran)


Remove field from structure array


mxSetCell (C and Fortran)


Value of one cell of array


mxSetClassName (C)


Convert structure array to MATLAB object array


mxSetData (C and Fortran)


Set pointer to data


mxSetDimensions (C and Fortran)


Modify number of dimensions and size of each dimension


mxSetField (C and Fortran)


Set structure array field, given structure field name and array index


mxSetFieldByNumber (C and Fortran)


Set structure array field, given field number and index


mxSetImagData (C and Fortran)


Imaginary data pointer for array


mxSetIr (C and Fortran)


IR array of sparse array


mxSetJc (C and Fortran)


JC array of sparse array


mxSetM (C and Fortran)


Number of rows in array


mxSetN (C and Fortran)


Set number of columns in array


mxSetNzmax (C and Fortran)


Set storage space for nonzero elements


mxSetPi (C and Fortran)


Set new imaginary data for array


mxSetPr (C and Fortran)


Set new real data for array


mxSetProperty (C and Fortran)


Set value of public property of MATLAB object

MEX Library


mexAtExit (C and Fortran)


Register function to call when MEX-function cleared or MATLAB software terminates


mexCallMATLAB (C and Fortran)


Call MATLAB function, user-defined function, or MEX-file


mexCallMATLABWithTrap (C and Fortran)


Call MATLAB function, user-defined function, or MEX-file and capture error information


mexErrMsgIdAndTxt (C and Fortran)


Display error message with identifier and return to MATLAB prompt


mexErrMsgTxt (C and Fortran)


Display error message and return to MATLAB prompt


mexEvalString (C and Fortran)


Execute MATLAB command in caller workspace


mexEvalStringWithTrap (C and Fortran)


Execute MATLAB command in caller workspace and capture error information


mexFunction (C and Fortran)


Entry point to C/C++ or Fortran MEX-file


mexFunctionName (C and Fortran)


Name of current MEX-function


mexGet (C)


Value of specified Handle Graphics property


mexGetVariable (C and Fortran)


Copy of variable from specified workspace


mexGetVariablePtr (C and Fortran)


Read-only pointer to variable from another workspace


mexIsGlobal (C and Fortran)


Determine whether variable has global scope


mexIsLocked (C and Fortran)


Determine whether MEX-file is locked


mexLock (C and Fortran)


Prevent clearing MEX-file from memory


mexMakeArrayPersistent (C and Fortran)


Make array persist after MEX-file completes


mexMakeMemoryPersistent (C and Fortran)


Make memory allocated by MATLAB software persist after MEX-function completes


mexPrintf (C and Fortran)


ANSI C PRINTF-style output routine


mexPutVariable (C and Fortran)


Array from MEX-function into specified workspace


mexSet (C)


Set value of specified Handle Graphics property


mexSetTrapFlag (C and Fortran)


Control response of MEXCALLMATLAB to errors


mexUnlock (C and Fortran)


Allow clearing MEX-file from memory


mexWarnMsgIdAndTxt (C and Fortran)


Warning message with identifier


mexWarnMsgTxt (C and Fortran)


Warning message

时间: 2024-10-06 00:53:57

Matlab与C/C++联合编程之Matlab以MEX方式调用C/C++代码(三)的相关文章

Matlab与C/C++联合编程之Matlab以MEX方式调用C/C++代码(二)

如果我有一个用C语言写的函数,实现了一个功能,如一个简单的函数: double add(double x, double y) { return x + y; } 现在我想要在Matlab中使用它,比如输入: >> a = add(1.1, 2.2) 3.3000 要得出以上的结果,那应该怎样做呢? 解决方法之一是要通过使用MEX文件,MEX文件使得调用C函数和调用Matlab的内置函数一样方便.MEX文件是由原C代码加上MEX文件专用的接口函数后编译而成的.可以这样理解,MEX文件实现了一种

Matlab以MEX方式调用C源代码【转载】

原文地址:http://blog.sina.com.cn/s/blog_468651400100coas.html 如果我有一个用C语言写的函数,实现了一个功能,如一个简单的函数: double add(double x, double y) { return x + y; } 现在我想要在Matlab中使用它,比如输入: >> a = add(1.1, 2.2) 3.3000 要得出以上的结果,那应该怎样做呢? 解决方法之一是要通过使用MEX文件,MEX文件使得调用C函数和调用Matlab的

MATLAB/Excel-如何将Excel数据导入MATLAB中

在使用MATLAB对矩阵进行数据处理时,为了方便编辑与修改,常常需要先将数据录入到Excel中,然后再将其导入到MATLAB中参与矩阵运算.本文在MATLAB 2013a和Office 2013环境下向大家演示如何将Excel数据导入到MATLAB中,其他版本的MATLAB.OFFICE方法大同小异,一起来看一下 工具/原料   Excel数据文件(格式xls或xlsx) MATLAB 7.x + 方法/步骤     将待导入的矩阵结构的数据录入Excel中,录入时注意行列要跟原矩阵一一对应  

【Matlab编程】生日快乐歌(显示歌词)—matlab版

clear all A4=440;%标准音A4 不同的曲调音调不同scale的取值范围不同 pt=44100;p0=pt/2;%频率 scale=A4/2^(9/12)*2.^((-12:11)/12);%这里可以调节音调高低,eg:改变式子中的-12:11为0:23 map=[1 3 5 6 8 10 12 13 15 17 18 20 22 24 25];%音符,这个需要看曲谱编码 score=[5 5 6 5 8 7 5 5 6 5 9 8 5 5 12 10 8 7 6 6 11 11

Matlab高级教程_第二篇:Matlab相见恨晚的模块_02_并行运算-2

1 MATLAB并行计算-从个人桌面到远程集群和云(陈伟/魏奋)视频摘录笔记 https://cn.mathworks.com/videos/parallel-computing-with-matlab-92865.html 2 数据.硬件和算法,MATLAB发展的方向 3 MATLAB并行计算工具的介绍 内嵌多线程(隐式) --MATLAB 内核函数和图像处理工具箱 --矩阵操作(linear algebra,fft,filter,etc) --无须代码修改 并行计算产品(显式) --Para

matlab学习笔记第四章——统计和MATLAB编程介绍

1.柱状图: >> x = [55,63,69,70,75,78,82,84,85,88,90,96,100]; >> y = [1,2,1,6,4,7,2,1,3,2,4,2,1]; >> bar(x,y) 2.我们可以使用barh命令产生水平的柱状图. 3.通过调用mean函数,MATLAB会告诉我们一组数据的均值是多少. 4.

python、matlab、c++的括号增加次序,以及图片存储方式

1 增加次序: python:(同c++多维数组) np.zeros([2,3,4]),先是按照内存空间均分为2份,每份又均分3份,最终再细分4份            2最大份,先按左分 例子:reshape一个一维数组即可看到 matlab: 先按列数,如果zeros(2,3,4),是先均等分成4份,然后再均等分成3份,最终均等分成2份     4最大份,先按右分 2 图片存储 python 用什么读 c++用opencv读:c,h,w? matlab直接读:h,w,c

Matlab高级教程_第二篇:Matlab相见恨晚的模块_02_并行运算-利用GPU并行执行MATLAB程序

1 MATLAB原文: 如果所有你想使用的函数支持GPU,你能够使用gpuArray把输入的数据传输到GPU,也能够唤起gather命令把传输值GPU的数据回收. 2 通过gpuDevice命令观察当前电脑的GPU设备 >> gpuDevice ans = CUDADevice (具有属性): Name: 'GeForce GT 430' % GPU设备的型号 Index: 1 % 当前GPU设备的编号 ComputeCapability: '2.1' % 计算能力 SupportsDoubl

玩转matlab之一维 gauss 数值积分公式及matlab源代码

目录 标准区间 一般区间 数值实验 实验一 实验二 总结 下节预告 matlab代码 在数值分析中,尤其是有限元刚度矩阵.质量矩阵等的计算中,必然要求如下定积分: \[ I=\int_a^b f(x)dx \]学好gauss积分也是学好有限元的重要基础,学过高等数学的都知道,手动积分能把人搞死(微笑脸),而且有些函数还不存在原函数,使用原始的手动算出原函数几乎是不现实的.因此非常有必要学习数值积分,简单讲就是近似计算,只要这个近似值精确度高和稳定性好就行.Gauss积分公式就是这么一个非常好用的