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

时间:2021-10-25 07:42:42
罗列一下以前自己学习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);
******************************************************

C语言与MATLAB接口 编程与实例 李传军编着的更多相关文章

  1. Go语言基础之接口(面向对象编程下)

    1 接口 1.1 接口介绍 接口(interface)是Go语言中核心部分,Go语言提供面向接口编程,那么接口是什么? 现实生活中,有许多接口的例子,比如说电子设备上的充电接口,这个充电接口能干什么, ...

  2. Go语言基础之接口

    Go语言基础之接口 接口(interface)定义了一个对象的行为规范,只定义规范不实现,由具体的对象来实现规范的细节. 接口 接口介绍 在Go语言中接口(interface)是一种类型,一种抽象的类 ...

  3. GO学习-(14) Go语言基础之接口

    Go语言基础之接口 接口(interface)定义了一个对象的行为规范,只定义规范不实现,由具体的对象来实现规范的细节. 接口 接口类型 在Go语言中接口(interface)是一种类型,一种抽象的类 ...

  4. 【转载】ANSYS的APDL与C语言混合编程(实例)

    原文地址:http://www.cnblogs.com/lyq105/archive/2010/05/04/1727557.html 本文讨论的不是利用C语言为ANSYS写扩展(或者说是用户子程序), ...

  5. VC 与Matlab混合编程之引擎操作详解

    Visual C++ 是当前主流的应用程序开发环境之一,开发环境强大,开发的程序执行速度快.但在科学计算方面函数库显得不够丰富.读取.显示数据图形不方便. Matlab 是一款将数值分析.矩阵计算.信 ...

  6. 《C#并发编程经典实例》笔记

    1.前言 2.开宗明义 3.开发原则和要点 (1)并发编程概述 (2)异步编程基础 (3)并行开发的基础 (4)测试技巧 (5)集合 (6)函数式OOP (7)同步 1.前言 最近趁着项目的一段平稳期 ...

  7. 【GoLang】golang 面向对象编程 & 面向接口编程

    005.面向对象&接口编程 1 面向函数编程 1.1 将数据作为参数传递到函数入参 1.2 对象与函数是分离的 2 面向对象编程 2.1 使用者看起来函数作为对象的属性而非参数 2.2 函数属 ...

  8. SAP接口编程 之 JCo3.0系列(01):JCoDestination

    SAP接口编程 之 JCo3.0系列(01):JCoDestination 字数2101 阅读103 评论0 喜欢0 JCo3.0是Java语言与ABAP语言双向通讯的中间件.与之前1.0/2.0相比 ...

  9. C++和MATLAB混合编程-DLL

    先小话一下DLL,DLL是动态链接库,是源代码编译后的二进制库文件和程序接口,和静态链接库不同的是,程序在编译时并不链接动态链接库的执行体,而是在文件中保留一个调用标记,在程序运行时才将动态链接库文件 ...

随机推荐

  1. iOS开发教程之:iPhone开发环境搭建

    安装条件: 硬件:一台拥有支持虚拟技术的64位双核处理器和2GB以上内存的PC. 注意:运行MAC OS,需要电脑支持虚拟技术(VT),安装时,需要将VT启动,在BIOS中开启. 软件: Window ...

  2. 使用 ZooKeeper 同步集群配置

    用 ZooKeeper 同步集群配置,当需要修改所有节点配置时,将配置更新到 ZooKeeper 的一个节点,引起这个节点数据发生变化, 其他所有需要同步配置的节点上的本地 Watcher 会立即发现 ...

  3. 关于innodb purge thread和master thread

    由innodb_purge_threads控制purge线程数. (>= 5.6.5)的版本号中该值默觉得1.最大值为32.默认值1表示innodb的purge操作被分离到purge线程中,ma ...

  4. USACO1.3.4 Combination Lock

    题目链接:1.3.4 为了防止有重复的数字,我开了个三维数组来标记,爆内存,又用vector标记,爆内存... 不得不感慨这份代码. /* ID:wang9621 PROG:combo LANG:C+ ...

  5. vb实验7-找出小于18000的最大素数

    vb实验7-找出小于18000的最大素数 vb实验7-找出小于18000的最大素数 ---–写给女朋友的题解 在窗体上画一个文本框,名称为TEXT1,两个命令按钮,C1和 C2,标题分别为" ...

  6. 51NOD 1238 最小公倍数之和 V3 [杜教筛]

    1238 最小公倍数之和 V3 三种做法!!! 见学习笔记,这里只贴代码 #include <iostream> #include <cstdio> #include < ...

  7. js获取url 中的值,并跳转相应页面

    实现方法:一:获取URL带QUESTRING参数的JAVASCRIPT客户端解决方案,相当于asp的request.querystring,PHP的$_GET1.函数: <Script lang ...

  8. UML与软件建模:第二次作业(类图中类的表示)

    一.类图 (1)类图定义 类图,是UML(统一建模语言)中用于描述"类"以及"类与类"之间的示意图.它形象的描述出了系统的结构,帮助人们理解系统. 类图是在&q ...

  9. Spring再接触 整合Hibernate

    首先更改配置文件 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http ...

  10. BZOJ 1340&colon; &lbrack;Baltic2007&rsqb;Escape逃跑问题

    1340: [Baltic2007]Escape逃跑问题 Time Limit: 5 Sec  Memory Limit: 162 MBSubmit: 285  Solved: 133[Submit] ...