China-pub.coM 第I5章MATLAB与其他编程语言结合 309 下载 设置array ptr指向的稀疏矩阵mxArray中的nzmax值(见上)。如果nzmaxi改变,那么向 量ir、pr和pi的大小(如果它们存在)也将随着改变。用helpdesk可得更多信息。 int *mxGetIr(const mxArray *array ptr); 返回一个包含有行数的整数向量指针,其中第一行有数字0,array ptr指向的稀疏矩 阵mxArray中有非零元素。如果操作失败,返回NULL。 void mxsetIr(mxArray array_ptr,int *ir); 定义array_ptr指向的稀疏矩阵mxArray中有非零元素的行。参数ir是一个整数向量指 针,包含使用的行数,这些行必须按列序来存储。在0处开始行计数。用helpdesk 可得更多信息。 int *mxGetJc(const mxArray *array_ptr); 和nxGetIr相似,但是返回的整数向量指针直接表示有非零元素的列来。用helpdesk 可得更多信息。 void mxsetJc(mxArray +array_ptr,int +jc); 和nxSetIr相似,但是设置直接表示有非零元素列的向量。用nelpdesk可得更多信息。 bool mxIssParse(const mxArray *array_ptr); 如果array_ptr指向的mxArray是稀疏矩阵类型,返回真。 下面的程序用来创建和处理字符串mxArrays。 命令集179 C中字符串的处理 mxChar 被字符串mxArray用来存储数据元素的数据类型。 mxArray *mxCreatecharArray(int ndim,const int *dims); 和nxCreateCellArray相似,但是是创建n维的字符矩阵,见命令集181。 mxArray *mxCreatecharMatrixFromstrings (int m,char **str); 和nxCreateCellMatrix相似(见命令集181),但是是用str指向的字符串向量创建 二维字符矩阵:m是字符串向量中的字符串数。 mxArray *mxcreatestring(const char *str); 用字符串str创建一个字符串矩阵mxArray。如果创建成功,则返回指向这个字符串 mxArray的指针:否则返回NULL。当字符串nxArray不再使用时,应用mxDestroyArray 来释放所占内存:见命令集75。 int mxGetstring (const mxArray +array_ptr,char *buf,int buflen); 复制array_ptr指向的字符串mxArray,得到的字符串保存在buf中。blen是buf仲可 以存放的最大字符数。如果复制成功,返回0:否则返回1。 bool mxIschar(const mxArray +array_ptr); 如果array ptr指向的mxArray是字符串类型,则返回真。 MATLAB5中一个新数据类型是多维数组:见2.2节。用下面的程序来处理这种类型 的mxArray
设置a rr a y_p t r指向的稀疏矩阵m x A r r a y中的n z m a x值(见上)。如果n z m a x改变,那么向 量i r、p r和p i的大小(如果它们存在)也将随着改变。用h e l p d e s k可得更多信息。 int *mxGetIr(const mxArray *array_ptr); 返回一个包含有行数的整数向量指针,其中第一行有数字 0,a rr a y_p t r指向的稀疏矩 阵m x A r r a y中有非零元素。如果操作失败,返回 N U L L。 void mxSetIr(mxArray *array_ptr, int *ir); 定义a rr a y_p t r指向的稀疏矩阵m x A r r a y中有非零元素的行。参数 i r是一个整数向量指 针,包含使用的行数,这些行必须按列序来存储。在 0处开始行计数。用 h e l p d e s k 可得更多信息。 int *mxGetJc(const mxArray *array_ptr); 和m x G e t I r相似,但是返回的整数向量指针直接表示有非零元素的列来。用 h e l p d e s k 可得更多信息。 void mxSetJc(mxArray *array_ptr, int *jc); 和m x S e t I r相似,但是设置直接表示有非零元素列的向量。用h e l p d e s k可得更多信息。 bool mxIsSParse(const mxArray *array_ptr); 如果a rr a y_p t r指向的m x A r r a y是稀疏矩阵类型,返回真。 下面的程序用来创建和处理字符串 m x A r r a y s。 命令集1 7 9 C中字符串的处理 m x C h a r 被字符串m x A r r a y用来存储数据元素的数据类型。 mxArray *mxCreateCharArray(int ndim, const int *dims); 和m x C r e a t e C e l l A r r a y相似,但是是创建n维的字符矩阵,见命令集1 8 1。 mxArray *mxCreateCharMatrixFromStrings(int m,char **str); 和m x C r e a t e C e l l M a t r i x相似(见命令集1 8 1 ),但是是用s t r指向的字符串向量创建 二维字符矩阵;m是字符串向量中的字符串数。 mxArray *mxCreateString(const char *str); 用字符串s t r创建一个字符串矩阵 m x A r r a y。如果创建成功,则返回指向这个字符串 m x A r r a y的指针;否则返回N U L L。当字符串m x A r r a y不再使用时,应用m x D e s t r o y A r r a y 来释放所占内存;见命令集1 7 5。 int mxGetString(const mxArray *array_ptr, char *buf, int buflen); 复制a rr a y_p t r指向的字符串m x A r r a y,得到的字符串保存在 b u f中。b u f l e n是b u f中可 以存放的最大字符数。如果复制成功,返回 0;否则返回1。 bool mxIsChar(const mxArray *array_ptr); 如果a rr a y_p t r指向的m x A r r a y是字符串类型,则返回真。 M ATLAB 5中一个新数据类型是多维数组;见 2 . 2节。用下面的程序来处理这种类型 的m x A r r a y。 第1 5章 M AT L A B与其他编程语言结合 3 0 9 下载
310 MATLAB5手册 China-pub.c 下载 注意:C中可以使用8、16或32位的带符号或不带符号的整数和单精度浮点小数的 mxArray来创建和计算。然而现在已不能在MALTAB环境中使用它们了。 命令集180C中多维数组的处理 mxArray *mxCreateNumericArray(int ndim,const int +dims,mxclassID class, MxComplexity ComplexFlag); 和nxCreateCellArray相似,但是这里是创建n维的数字矩阵。数字类型为class, 见命令集176中的nxClassID。如果有复数,则ComplexFlag设为nxCOMPLEX:否 则为mxREAL。 void *mxGetData(const mxArray tarray_ptr); 和nxGetPr相似,见命令集177,但是返回一个void指针。更多的是用在除双精度浮 点小数以外的其他类型数字矩阵中。 void mxsetData(mxArray tarray_ptr ,void *data_ptr)i 和nxSetPr相似,见命令集I77,但是返回一个void指针。更多的是用在除双精度浮 点小数以外的其他类型数字矩阵中。 void *mxGetImagData(const mxArray array_ptr)i 和nxGetPi相似,见命令集177,但是返回一个void指针。更多的是用在除双精度 浮点小数以外的其他类型数字矩阵中。 void mxsetImagData(mxArray array_ptr,void *pi); 和nxSetPi相似,见命令集I77,但是返回一个void指针。更多的是用在除双精度 浮点小数以外的其他类型数字矩阵中。 void mxsetLogical(mxArray array_ptr); 在array ptr指向的数字mxArray中设置逻辑标识符。MATLAB就会把mxArray的数据 当作逻辑变量来对待,也就是0是假,其他值是真。 void mxclearLogical(mxArray *array_ptr); 去掉数字mxArray中的逻辑标识符,见上。 bool mxIsLogical(const mxArray tarray_ptr); 检查数字mxArray中的逻辑标识符的设置,见上。如果设置了,就返回真:否则返回假。 MATLAB5中一新数据类型是细胞矩阵,也称细胞数组:见5.5节。下面的程序用来处理 这种类型的mxArray: 命令集181 C中细胞矩阵的处理 mxArray *mxCreatecellArray(int ndim,const int *dims): 创建一个n维的空细胞矩阵。参数ndim是维数,dims是表示每维大小的向量指针。如 果创建成功,就返回指向细胞矩阵的指针:否则返回NULL或停止程序运行。 mxArray *mxCreatecellMatrix(int m ,int n); 和上个函数相似,但是是用来创建一个二维mXn的细胞矩阵。 mxArray *mxGetcell(const mxArray tarray_ptr,int index); 从细胞mxArray中复制一个细胞。参数array ptr是指向细胞mxArray的指针,index表
注意: C中可以使用 8、1 6或3 2位的带符号或不带符号的整数和单精度浮点小数的 m x A r r a y来创建和计算。然而现在已不能在 M A LTA B环境中使用它们了。 命令集1 8 0 C中多维数组的处理 mxArray *mxCreateNumericArray(int ndim, const int *dims, mxClassID class, MxComplexity ComplexFlag); 和m x C r e a t e C e l l A r r a y相似,但是这里是创建 n维的数字矩阵。数字类型为 c l a s s, 见命令集1 7 6中的m x C l a s s I D。如果有复数,则 C o m p l e x F l a g设为m x C O M P L E X;否 则为m x R E A L。 void *mxGetData(const mxArray *array_ptr); 和m x G e t P r相似,见命令集1 7 7,但是返回一个v o i d指针。更多的是用在除双精度浮 点小数以外的其他类型数字矩阵中。 void mxSetData(mxArray *array_ptr ,void *data_ptr); 和m x S e t P r相似,见命令集1 7 7,但是返回一个v o i d指针。更多的是用在除双精度浮 点小数以外的其他类型数字矩阵中。 void *mxGetImagData(const mxArray *array_ptr); 和m x G e t P i相似,见命令集 1 7 7,但是返回一个 void 指针。更多的是用在除双精度 浮点小数以外的其他类型数字矩阵中。 void mxSetImagData(mxArray *array_ptr, void *pi); 和m x S e t P i相似,见命令集 1 7 7,但是返回一个 v o i d指针。更多的是用在除双精度 浮点小数以外的其他类型数字矩阵中。 void mxSetLogical(mxArray *array_ptr); 在a rr a y_p t r指向的数字m x A r r a y中设置逻辑标识符。M AT L A B就会把m x A r r a y的数据 当作逻辑变量来对待,也就是 0是假,其他值是真。 void mxClearLogical(mxArray *array_ptr); 去掉数字m x A r r a y中的逻辑标识符,见上。 bool mxIsLogical(const mxArray *array_ptr); 检查数字m x A r r a y中的逻辑标识符的设置,见上。如果设置了,就返回真;否则返回假。 M ATLAB 5中一新数据类型是细胞矩阵,也称细胞数组;见 5 . 5节。下面的程序用来处理 这种类型的m x A r r a y: 命令集1 8 1 C中细胞矩阵的处理 mxArray *mxCreateCellArray(int ndim, const int *dims); 创建一个n维的空细胞矩阵。参数 n d i m是维数,d i m s是表示每维大小的向量指针。如 果创建成功,就返回指向细胞矩阵的指针;否则返回 N U L L或停止程序运行。 mxArray *mxCreateCellMatrix(int m ,int n); 和上个函数相似,但是是用来创建一个二维 m×n的细胞矩阵。 mxArray *mxGetCell(const mxArray *array_ptr, int index); 从细胞m x A r r a y中复制一个细胞。参数a rr a y_p t r是指向细胞m x A r r a y的指针,i n d e x表 3 1 0 M ATLAB 5 手册 下载
China-bub.coM 第I5章MATLAB.与其他编程语言结合 311 下载 示第一个细胞与被复制细胞之间的细胞数:见命令剿76中mxCalcSingleSubscript。 如果复制成功,返回指向细胞nxArray的指针;否则返回NULL。 void mxsetcell(mxArray +array_ptr,int index,mxArray +value); 设置细胞mxArray中的一个细胞。参数index表示第一个细胞与被设置细胞之间的细 胞数:见命令集176中mxCalcsingleSubscript。参数value是细胞指针,细胞的 值将被设置在array ptr指向的mxArray中。 bool mxIscell(const mxArray tarray_ptr); 如果array ptr指向的mxArray是细胞类型,则返回真。 MATLAB5中另一新数据类型是结构:见12.5节。下面的程序用来处理这种类型的 mxArray: 命令集182 C中结构的处理 mxArray +mxCreatestructArray(imdim,const int *dims ,int nfields,const char *+field_names); 和nxCreateCel1 Array相似(见命令集181),但是是创建n维的结构矩阵。参数 nfields表示每个元素中的域数,field names是字符串向量指针,表示域名。 m x A r r a y m x c r e a t e s t r u c t M a t m i i tt n t i n t n f i e l d sc,o n s tc h a r **field names); 和上个函数相似,但是是用来创建二维mXn的结构矩阵。 int mxGetNumberofFields(const mxArray tarray_ptr); 返回array ptr指向的结构mxArray中的域数。如果操作失败,则返回0。 mx Ar r aym x G et F i el d cmoxnAsrtr aya r r a y p tim,t in d e x cons tch ar *field name); 返回array_ptr指向的结构mxArray中一个元素的一个域值。参数index表示第一个元素 和返回的元素之间的元素个数:见命令集I76中mxCalcSingleSubscript。参数 field name表示元素中域名的字符串,如果操作成功,返回指向这个域的指针:否则 返回NULL。 void mxsetField(mxArray +array_ptr,int index,const char +field_name,mxArray +value); 和上个函数相似,但是是用指针vae指向的值来设置域值。 int mxGetFieldNumber(const mxArray *array_ptr,const char +field_name); 返回array ptr指向的结构mxArray中一个域中的域数。字符串field_name表示域名字, 如果操作成功,则返回结构中域的个数(从0开始):否则返回一1。 const ch a r m x G e t F i e l d N a m e B y N u m b n x A r o a y ar r a yp t tn t field number); 返回array ptr指向的结构mxArray中的域名。参数field number表示结构中域的一个 数字序列(从0开始)。 m x A r r ay m x G e t F i e l d B y N u m b e m ta o n sy a rr a y p t irn t i n d e x i n t field number);
示第一个细胞与被复制细胞之间的细胞数;见命令集1 7 6中m x C a l c S i n g l e S u b s c r i p t。 如果复制成功,返回指向细胞m x A r r a y的指针;否则返回N U L L。 void mxSetCell(mxArray *array_ptr, int index, mxArray *value); 设置细胞m x A r r a y中的一个细胞。参数 i n d e x表示第一个细胞与被设置细胞之间的细 胞数;见命令集1 7 6中m x C a l c S i n g l e S u b s c r i p t。参数v a l u e是细胞指针,细胞的 值将被设置在a rr a y_p t r指向的m x A r r a y中。 bool mxIsCell(const mxArray *array_ptr); 如果a rr a y_p t r指向的m x A r r a y是细胞类型,则返回真。 M ATLAB 5 中另一新数据类型是结构;见 1 2 . 5节。下面的程序用来处理这种类型的 m x A r r a y: 命令集1 8 2 C中结构的处理 mxArray *mxCreateStructArray(int ndim, const int *dims ,int nfields, const char **field_names); 和m x C r e a t e C e l l A r r a y相似(见命令集 1 8 1 ),但是是创建 n维的结构矩阵。参数 n f i e l d s表示每个元素中的域数,f i e l d_n a m e s是字符串向量指针,表示域名。 mxArray *mxCreateStructMatrix(int m, int n, int nfields, const char * * f i e l d _ n a m e s ) ; 和上个函数相似,但是是用来创建二维 m×n的结构矩阵。 int mxGetNumberOfFields(const mxArray *array_ptr); 返回a rr a y_p t r指向的结构m x A r r a y中的域数。如果操作失败,则返回 0。 mxArray *mxGetField(const mxArray *array_ptr, int index, const char * f i e l d _ n a m e ) ; 返回a rr a y_p t r指向的结构m x A r r a y中一个元素的一个域值。参数 i n d e x表示第一个元素 和返回的元素之间的元素个数;见命令集 1 7 6中m x C a l c S i n g l e S u b s c r i p t。参数 f i e l d_n a m e表示元素中域名的字符串,如果操作成功,返回指向这个域的指针;否则 返回N U L L。 void mxSetField(mxArray *array_ptr, int index, const char *field_name, mxArray * v a l u e ) ; 和上个函数相似,但是是用指针 v a l u e指向的值来设置域值。 int mxGetFieldNumber(const mxArray *array_ptr, const char *field_name); 返回a rr a y_p t r指向的结构m x A r r a y中一个域中的域数。字符串f i e l d _ n a m e表示域名字, 如果操作成功,则返回结构中域的个数 (从0开始);否则返回-1。 const char *mxGetFieldNameByNumber(const mxArray *array_ptr, int f i e l d _ n u m b e r ) ; 返回a rr a y_p t r指向的结构m x A r r a y中的域名。参数f i e l d_n u m b e r表示结构中域的一个 数字序列(从0开始)。 mxArray *mxGetFieldByNumber(const mxArray *array_ptr, int index, int f i e l d _ n u m b e r ) ; 第1 5章 M AT L A B与其他编程语言结合 3 1 1 下载
312 MATLAB5手册 China-pub.com 下载 和nxGetField相似,但是返回的是域名,field number表示结构中域的一个数字序 列(从0开始)。 void mxsetField ByNumber mxa nrayy ptrint index,int field number, mxArray *value); 和nxSetField相似,但是返回的是域名,field number表示结构中域的一个数字序列 (从0开始)。 bool mxIsstruct (const mxArray *array_ptr); 如果array ptr指向的nxArray是结构类型,则返回真。 int mxsetclassName (mxArray tarray_ptr,const char +classname); 将array ptr指向的MATLAB结构转换成classname:指定的MATLAB对象。如果转换 成功,返回O:否则返回一个非零数。当用load读入对象到MATLAB中时,要检查类 classname是否存在。如果不存在,则不能将对象反转换成结构。 下面的程序用来在C中取一些特殊常数值,比如机器无穷小正数和无穷大正数。还有一些 程序用来检查变量的值是否等于这些常数。 命令集183 C中特殊常数 double mxGetEps(void); 返回MATLAB中机器无穷小正数。 double mxGetInf(void); 返回MATLAB中inf的值,也就是无穷大的正数。 bool mxIsInf(double value); 如果value是无穷大正数,就返回真:否则返回假。 double;mxGetNaN(void); 返回MATLAB中的NaN值。 bool mxIsNaN(double value); 如果value是一个NaN,返回真:否则返回假。 bool mxIsFinite(double value); 如果value不是一个inf或NaN,就返回真:否则返回假。 下面的程序用来调试C语言程序。 命令集184 C中调试程序 void mxAssert(int expr,char terror_message)i 在调试时使用,如果expr为假,则程序停止,并打印出expr、文件名、行数和错误信 息。如果epr为真,则对程序没有影响。 void mxAsserts(int expr,char error message); 同上,但是expr为假时不打印出expr。 MATLAB4.2中的一些程序已被新程序所代替。虽然这些I旧程序不应该再在新的C程序中
和m x G e t F i e l d相似,但是返回的是域名, f i e l d_n u m b e r表示结构中域的一个数字序 列(从0开始)。 void mxSetFieldByNumber(mxArray *array_ptr, int index ,int field_number, mxArray *value); 和m x S e t F i e l d相似,但是返回的是域名, f i e l d_n u m b e r表示结构中域的一个数字序列 (从0开始)。 bool mxIsStruct(const mxArray *array_ptr); 如果a rr a y_p t r指向的m x A r r a y是结构类型,则返回真。 int mxSetClassName(mxArray *array_ptr, const char *classname); 将a rr a y_p t r指向的M AT L A B结构转换成c l a s s n a m e指定的M AT L A B对象。如果转换 成功,返回0;否则返回一个非零数。当用 l o a d读入对象到M AT L A B中时,要检查类 c l a s s n a m e是否存在。如果不存在,则不能将对象反转换成结构。 下面的程序用来在C中取一些特殊常数值,比如机器无穷小正数和无穷大正数。还有一些 程序用来检查变量的值是否等于这些常数。 命令集1 8 3 C中特殊常数 double mxGetEps(void); 返回M AT L A B中机器无穷小正数。 double mxGetInf(void); 返回M AT L A B中i n f的值,也就是无穷大的正数。 bool mxIsInf(double value); 如果v a l u e是无穷大正数,就返回真;否则返回假。 double; mxGetNaN(void); 返回M AT L A B中的N a N值。 bool mxIsNaN(double value); 如果v a l u e是一个N a N,返回真;否则返回假。 bool mxIsFinite(double value); 如果v a l u e不是一个i n f或N a N,就返回真;否则返回假。 下面的程序用来调试C语言程序。 命令集1 8 4 C中调试程序 void mxAssert(int expr, char *error_message); 在调试时使用,如果e x p r为假,则程序停止,并打印出 e x p r、文件名、行数和错误信 息。如果e x p r为真,则对程序没有影响。 void mxAssertS(int expr, char *error_message); 同上,但是e x p r为假时不打印出e x p r。 M ATLAB 4.2中的一些程序已被新程序所代替。虽然这些旧程序不应该再在新的C程序中 3 1 2 M ATLAB 5 手册 下载
China-bub.com 第15章ATLAB与其他编程语言结合 313 下载 使用,但是它们还存在,以便MATLAB5能向下兼容。 命令集185 C中旧的矩阵程序 mxCreateFull mxIsFull mxIsstring mxFreeMatrix 15.2.2C中对MAT文件的处理 下面的例子说明了如何写和读一个MAT文件,也就是MATLAB以内部二进制格式存储的 数据文件。 ■例15.1 假设C程序中要用到一个服从正态分布的随机矩阵。这个简单的矩阵在C程序中生成很困 难,但是在MATLAB中只需用一个命令。先定义一个10×10的服从正态分布的矩阵,并用 save命令保存: oldMatrix=randn(10); 号创建一个随机矩阵 save data oldMatrix;号保存这个矩阵到文件data.mat中 再编写一个C程序,用来读这个随机矩阵。矩阵的所有元素乘以2,并生成一个新矩阵保 存到文件data.mat中。C程序保存在文件matex.c中。 #include "mat.h" void main() MATFile *mfp; mxArray *A_ptr,*B_ptr; double *A,*B; int M,N,i,j; 体从文件中读矩阵*/ mfp =matOpen("data.mat","u"); A_ptr matGetArray(mfp,"OldMatrix"); M mxGetM(A_ptr) N mxGetN(A_ptr); A mxGetPr(A_ptr); 体创建新矩阵* B_ptr mxCreateDoubleMatrix(M,N,mxREAL); mxSetName(B_ptr,"NewMatrix"); B mxGetPr(B_ptr); 体将原矩阵乘以2后保存到新矩阵中*/ for (i =0;i M;i++) for (j=0;j<N;j++) B[i+M*j]=2*A[i+M*j门;
使用,但是它们还存在,以便 M ATLAB 5能向下兼容。 命令集1 8 5 C中旧的矩阵程序 mxCreateFull mxIsFull mxIsString mxFreeMatrix 15.2.2 C中对M AT文件的处理 下面的例子说明了如何写和读一个 M AT文件,也就是M AT L A B以内部二进制格式存储的 数据文件。 ■ 例1 5 . 1 假设C程序中要用到一个服从正态分布的随机矩阵。这个简单的矩阵在 C程序中生成很困 难,但是在 M AT L A B中只需用一个命令。先定义一个 1 0×1 0的服从正态分布的矩阵,并用 s a v e命令保存: O l d M a t r i x = r a n d n ( 1 0 ) ; % 创建一个随机矩阵 save data OldMatrix; % 保存这个矩阵到文件d a t a . m a t中 再编写一个C程序,用来读这个随机矩阵。矩阵的所有元素乘以 2,并生成一个新矩阵保 存到文件d a t a . m a t中。C程序保存在文件m a t e x . c中。 第1 5章 M AT L A B与其他编程语言结合 3 1 3 下载 /*从文件中读矩阵*/ /*创建新矩阵*/ /*将原矩阵乘以2后保存到新矩阵中*/