C语言与MATLAB接口 编程与实例 李传军编着

罗列一下以前自己学习C语言与MATLAB混编的笔记,顺便复习一遍。

《C语言与MATLAB接口 编程与实例 李传军编着》(未看完,目前看到P106)

目录P4-8

******************************************************

C-MEX函数:从MATLAB调用C语言或Fortran语言编写的函数。

MEX文件:是一种按一定格式,使用C语言或者FORTRAN语言编写的,由MATLAB解释器自动调用并执行的动态链接函数。在Windows系统中,MEX文件的类型后缀名为dll,WIN7中64位电脑为mexw64(Linux中为mexsg)。

MATLAB系统系统规定,MEX文件的执行优先级高于M文件。

MEX文件的使用与MATLAB内建函数的调用方式相同。由于MEX文件无法显示相应的函数信息,因此,在一般情况下,在构造一个MEX文件的同时,会相应编写一个MATLAB的M文件作为其帮助解释文件,并存放在相同目录下。该M文件不可包含任何可执行语句,只包含一些帮助信息。

在同一个目录下有三个同名文件,对应“.c”文件,“.dll”文件,“.m”文件。

******************************************************

mxArray结构体

C语言与MATLAB之间的接口是通过一个由C语言编写的mxArray结构体。

针对MATLAB中所有数据类型,如数值阵列(双精度、单精度、int8、int16、uint16、int32、uint32等)、字符串、离散矩阵、单元阵列、结构体、对象、多维阵列、逻辑阵列、空阵列。这些MATLAB的数据类型都能用mxArray结构体来定义。

******************************************************

库函数

在MATLAB的外部接口函数库中,存在4种类型与C有关的库函数。

分别为C Engine Routines、C MAT-File Routines、C MEX-Functions和C MX Functions。

其中,C MEX Functions 和 C MX Functions分别是以mex和mx为前缀的,分别完成不同功能。

mx函数库主要为用户提供一种在C语言中创建、访问、操作和删除mxArray结构体对象的方法。

mex函数库主要功能是与MATLAB环境进行交互,从MATLAB环境中获取必要的阵列数据,并且返回一定的信息,包括文本提示、数据阵列等。

******************************************************

编写、编译、链接C-MEX函数的方法

使用MEX指令不仅能够创建C语言的MEX函数,也可创建Fortran语言的MEX函数。

P16 表2.1 MEX命令控制参数

mex [option1...optionN] sourcefile1 [...sourcefileN] [objectfile1...objectfileN] [libraryfile1...libraryfileN];

其中,option是MEX指令的命令行参数选项;sourcefile为参与编译生成MEX文件的所有C原文件;objectfile为参与编译的对象文件;libraryfile为参与编译的函数库文件。

编写源代码:利用代码编写器,如VC++、MATLAB等编写C语言源代码。

编译:对源代码进行编译,生成目标文件。

链接:将源文件生成的目标文件、必要的库文件及其他的目标文件链接在一起,生成最终可执行的程序文件。

******************************************************

mex -setup命令

>>mex -setup; % 安装编译器

>>edit; % 编写C-MEX函数文件

>>edit **.c % 编写C-MEX函数文件

******************************************************

C与MATLAB存储方式的区别:

在C语言中,数据是按行存储的,如果按列读取就会出现异常;

在MATLAB中,数据时按列存储的,如果按行读取就会出现异常。

C-MEX函数式用C语言编写的MATLAB接口函数。在编写C-MEX函数时,一定要按照MATLAB语言中数据的存储和读取方式来进行。

******************************************************

头文件是 #include "mex.h"

接口程序函数是:

void mexFunction(

int nlhs, // 左边(输出)参数的个数

mxArray *plhs[], // 左边参数的数组

int nrhs, // 右边(输入)参数的个数

const mxArray *prhs[] // 右边参数的数组

){……}

编写C-MEX函数的基本流程:

1、编写C-MEX接口函数。

2、定义输入变量和输出变量的类型及维数。

3、检查输入和输出参量的个数。

4、检查输入参量的数据类型。

5、获取输入参量的维数。

6、检查输入参数的维数条件。

7、设定输出参量的维数。

8、生成输出参量的mxArray结构体。

9、获取输入参量的指针。

10、获取输出参量的指针。

11、调用C子程序。

12、编写C计算子程序,并置于mexFunction函数之前。

13、编译链接。

14、分析测试。

******************************************************

当采用变量来表示标量时,须用mxGetScalar()函数从mxArray结构体获取变量值。

当采用指针变量表示标量时,须用mxGetPr()函数从mxArray结构体获取变量值。

******************************************************

mxIsDouble:判断阵列是否为双精度类型。

bool mxIsDouble(const mxArray *array_ptr);

mxIsComplex:判断阵列是否为复数类型。

bool mxIsComplex(const mxArray *array_ptr);

mxGetM:获取阵列的行数。

int mxGetM(const mxArray * array_ptr);

mxGetN:获取阵列的列数。

int mxGetN(const mxArray * array_ptr);

mxGetPr:获取阵列的实数部分的数据指针。

double *mxGetPr(const mxArray *array_ptr);

mxGetPi:获取阵列的虚数部分的数据指针。

double *mxGetPi(const mxArray *array_ptr);

mxGetScalar:获得某个阵列的实数部分的第一个数据。

double mxGetScalar(const mxArray *array_ptr);

mxCreateDoubleMatrix:创建一个二维的未赋值的双精度浮点类型的阵列。

mxArray *mxCreateDoubleMatrix(int m,int n,mxComplexity complexFlag);

mxCreateScalarDouble:创建一个标量的未赋值的双精度浮点类型的阵列。

mxArray *mxCreateScalarDouble(double value);

******************************************************

多维数组常用函数:

mxGetNumberOfDimensions:获得阵列的维数。

int mxGetNumberOfDimensions(const mxArray *array_ptr);

mxGetDimensions:获得一个指向阵列维数大小的数组指针。

const int *mxGetDimensions(const mxArray *array_ptr);

mxCreateNumbericArray:创建一个N维的未赋值的数值阵列。

mxArray*mxCreateNumericArray(int ndim,const int *dims,mxClassID class,mxComplexity ComplexFlag);

mxGetNumberOfElements:获得阵列中元素的个数。

int mxGetNumberOfElements(const mxArray *array_ptr);

******************************************************

字符串函数:

mxIsChar:判断阵列是否为字符串类型的阵列。

bool mxIsChar(const mxArray *array_ptr);

mxGetString:获得字符串阵列的内容。

int mxGetString(const mxArray*array_ptr,char*buf,int buflen);

mxCreateString:创建一个1*N维的字符串阵列。

mxArray *mxCreateString(const char *str);

******************************************************

P86 数据类型间的对应关系表

函数介绍:

mxIsSingle:判断阵列的数据类型是否为单精度的浮点类型。

bool mxIsSingle(const mxArray *array_ptr);

mxIsInt8:判断阵列的数据类型是否为8位的整数类型。

bool mxIsInt8(const mxArray *array_ptr);

mxIsInt16:判断阵列的数据类型是否为16位的整数类型。

bool mxIsInt16(const mxArray *array_ptr);

mxIsInt32:判断阵列的数据类型是否为32位的整数类型。

bool mxIsInt32(const mxArray *array_ptr);

mxIsUint8:判断阵列的数据类型是否为8位的整数类型。

bool mxIsUint8(const mxArray *array_ptr);

mxIsUint16:判断阵列的数据类型是否为16位的整数类型。

bool mxIsUint16(const mxArray *array_ptr);

mxIsUint32:判断阵列的数据类型是否为32位的整数类型。

bool mxIsUint32(const mxArray *array_ptr);

mxGetData:获得阵列的指针(返回值为void)。

void *mxGetData(const mxArray *array_ptr);

mxGetImagedata:获得阵列虚数部分数据的指针(返回值为void)。

void *mxGetImagData(const mxArray *array_ptr);

mxCreateNumericMatrix:创建一个二维的未赋值的数值阵列。

mxArray *mxCreateNumericMatrix(int m,int n,mxClassID class,mxComplexity ComplexFlag);

mxCreateNumericArray:创建一个N维的未赋值的数值阵列。

mxArray *mxCreateNumericArray(int ndim,const int *dims,mxClassID class,mxComplexity ComplexFlag);

mxSetData:设置阵列的数据指针。

void mxSetData(mxArray *array_ptr,void *data_ptr);

mxSetImagData:设置阵列的虚部数据指针。

void mxSetImagData(mxArray *array_ptr,void *pi);

******************************************************

C调用MATLAB函数

mexCallMATLAB:用于调用MATLAB内建函数或用户定义的MATLAB文件以及MEX文件。

int mexCallMATLAB(int nlhs,mxArray*plhs[],int nrhs,mxArray*prhs[],const char *command_name);

mxDestroyArray:释放mxArray阵列所占用的内存。

void mxDestroyArray(mxArray *array_ptr);

******************************************************

Structures阵列

函数介绍:

mxIsStruct:判断阵列是否为结构体阵列。

bool mxIsStruct(const mxArray* array_ptr);

mxGetNumberOfDimensions:获得阵列的维数。

int mxGetNumberOfDimensions(const mxArray *array_ptr);

mxGetDimensions:获得一个指向阵列维数大小的数组指针。

const int *mxGetDimensions(const mxArray*array_ptr);

mxGetNumberOfFields:获得结构体阵列的域的数量。

int mxGetNumberOfFields(const mxArray *array_ptr);

mxGetFieldNameByNumber:通过索引获得域名。

const char*mxGetFieldNameByNumber(const mxArray *array_ptr,int field_number);

mxGetFieldNumber:获得指定域名的索引值。

int mxGetFieldNumber(const mxArray *array_ptr,const char*field_name);

mxGetField:获得指定结构体阵列指定元素的指定域的值。

mxArray*mxGetField(const mxArray*array_ptr,int index,const char*field_name);

mxCalcSingleSubscript:获取指定元素的索引值。

int mxCalcSingleSubscript(const mxArray*array_ptr,int nsubs,int *subs);

mxCreateStructArray:创建一个N维未赋值的结构体阵列。

mxArray*mxCreateStructArray(int ndim,const int *dims,int nfields,const char**field_names);

******************************************************