罗列一下以前自己学习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. HBase集群搭建

    HBase集群搭建 搭建环境:假设我们的linux环境已经准备好,包括网络.JDK.防火墙.主机名.免密登录等都没有问题,而且一定要有zookeeper.下面我们用3台linux虚拟机来搭建Hbase ...

  2. 图片流量节省大杀器:基于CDN的sharpP自适应图片技术实践

    版权声明:本文由陈忱原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/156 来源:腾云阁 https://www.qclou ...

  3. Eclipse全面提速小技巧

    转自:http://rongmayisheng.com/post/eclipse%E5%85%A8%E9%9D%A2%E6%8F%90%E9%80%9F 欢迎关注我的社交账号: 博客园地址: http ...

  4. 设置pictureBox的边框颜色

    private void pictureBox2_Paint(object sender, PaintEventArgs e) { PictureBox p = (PictureBox)sender; ...

  5. poj-----(2528)Mayor's posters(线段树区间更新及区间统计+离散化)

    Mayor's posters Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 43507   Accepted: 12693 ...

  6. Sudoku Solver [LeetCode]

    Write a program to solve a Sudoku puzzle by filling the empty cells. Empty cells are indicated by th ...

  7. Android 编程下的代码混淆

    什么是代码混淆 Java 是一种跨平台的.解释型语言,Java 源代码编译成中间”字节码”存储于 class 文件中.由于跨平台的需要,Java 字节码中包括了很多源代码信息,如变量名.方法名,并且通 ...

  8. asp.net 使用UrlRewritingNet.UrlRewriter组件URL重写,伪静态详解

    目录 URL重写的业务需求 ReWritingNet组件主要功能 配置IIS(IIS7/8环境下) 程序代码 重写规则 一,URL重写的业务需求 顾客可以直接用浏览器bookmark功能将页面连结储存 ...

  9. Gliffy

    http://www.gliffy.com Gliffy 支持在线制作流程图,能够很好的支持中文,基础版本免费.在线制作的思维导图是公开的,高级版本有设置隐私权的权力.可以嵌入博客,办公室应用软件中, ...

  10. 数据库索引<二> 补充前篇 (上一篇抽风了,这个补上)

    在前一个创建索引中已经大概说了三部分的影响,基本应该注意哪一些.写完上一篇后我感觉有很多地方没有写清楚,所以这篇就是更深入一些的理解索引到底是怎么和数据表关联,怎么快速查询的. 先看一下下面的图,图是 ...