Matlab C混合编程

用C++(或者C)语言操作MATLAB,有三种途径:

MEX文件

在MATLAB中可调用的C或Fortran语言程序称为MEX文件。MATLAB可以直接把MEX文件视为它的内建函数进行调用。MEX文件是动态链接的子例程,MATLAB解释器可以自动载入并执行它。MEX文件主要有以下用途: 对于大量现有的C或者Fortran程序可以无须改写成MATLAB专用的M文件格式而在MATLAB中执行。 对于那些MATLAB运算速度过慢的算法,可以用C或者Frotran语言编写以提高效率。

MAT文件应用程序

MAT文件是MATLAB专用的用于保存数据至磁盘和向MATLAB导入、从MATLAB导出数据的数据文件格式。MAT文件提供了一种简便的机制,它允许你在两个平台之间以灵活的方式移动数据。而且,它还提供了一种途径来向其它单机MATLAB应用导入或者导出数据。 为了简化在MATLAB环境之外对MAT文件的使用,MATLAB给出了一个操作例程库,通过它,我们可以使用C/C++或者Fortran程序读写MAT文件。

引擎应用程序

MATLAB提供了一系列的例程使得别的程序可以调用MATLAB,从而把MATLAB用作一个计算引擎。MATLAB引擎程序指的是那些通过管道(在UNIX系统中)或者ActiveX(在Windows系统中)与独立MATLAB进程进行通信的C/C++或者Fortran程序。

1.MEX文件

    #include “mex.h”  
    /*
    *timestwo.c-example found in API guide  
    *  
    *Computational function that takes a scalar and doubles it  
    *  
    *This is a MEX-File for MATLAB.  
    *Copyright(c)  
    */  
    void timestwo(double y[],double x[]); 
    void timestwo(double y[],double x[]) 
    { 
    y[0]=2.0*x[0]; 
    } 
    void mexFunction(int nlhs,mxArray* plhs[],int nrhs,const mxArray *prhs[])
    /*nlhs是MATLAB命令行方式下输出参数的个数 
    *plhs是MATLAB命令行方式下的输出参数; 
    *nrhs是MATLAB命令行方式下输入参数的个数; 
    *prhs[]是MATLAB命令行方式下的输入参数; 
    */ 
    { 
    double *x,*y; 
    int mrows,ncols; 
    /*Check for proper number of arguments.*/ 
    if (nrhs!=1){ 
    mexErrMsgTxt(“One input required”); 
    }
    else if(nlhs>=1) 
    { 
    mexErrMsgTxt(“Too many output arguments”); 
    } 
    /*在MATLAB命令行方式下,本MEX文件的调用格式是y=timestwo(x)
    输入参数(x)个数=1,输出参数(y)个数=1,所以在程序一开始就检查
    nrhs时候==1以及nlhs是否>=1(因为MATLAB有一个缺省的输出参数ans,所以nlhs可以==0*/
    /*The input must be a non comlex scalar double.*/
    mrows=mxGetM(prhs[0]);//矩阵行数<br>
    ncols=mxGetN(prhs[0]);//矩阵列数<br>
    if (!mxIsDouble(prhs[0])|| mxIsComplex(prhs[0])||!(mrows==1&amp;ncols==1))
    {
    mexErrMsgTxt(“Input must be a noncomplex scalar double”);
    }
    //判断输入举证是否是double类,以及它是否只包含单个元素无嵌套
    //为输出创建一个矩阵,显然这个矩阵也应该是1*1的
    plhs[0]=mxCreateDoubleMatrix(mrows,ncols,mxREAL);
    x=mxGetPr(prhs[0]);
    y=mxGetPr(plhs[0]);
    timestwo(y,x);
    }

matlab命令行上输入以下语句:

    mex testmex.cpp;
    x=2;
    y=testmex(x);

2.MAT文件:

libmat.dll:用于操作mat文件 libmx.dll:用于操作mat文件中的矩阵 MATLAB中常用的矩阵类型:

3.(复)双精度矩阵:

MATLAB中最常用的数据类型便是(复)双精度、非稀疏矩阵,这些矩阵的元素都是双精度(double)的,矩阵的尺寸为m×n,其中m是总行数,m是总列数。矩阵数据实际存放在两个双精度向量中——一个向量存放的是数据的实部,另一个向量存放的是数据的虚部。指向这两个向量的指针一般被写做“pr” (pointer to real data,指向实数据的指针)和“pi” (pointer to imaginary data,指向虚数据的指针)”。如果一个矩阵的pi为空的话,说明它是实双精度矩阵。 稀疏矩阵(Sparse Matrices) MATLAB中稀疏矩阵的存储格式与众不同。如同双精度矩阵一样,它拥有参数pr和pi,同时它还具用三个附加的参数:nzmax,ir以及jc。 nzmax是个整型数,其值为向量ir及pr、pi(如果存在的话)可能的最大长度。它是稀疏矩阵中不为零的元素的个数。 ir指向一个长度为nzmax的整型数阵列,阵列包含的是pr和pi中对应元素的行号。 jc指向一个长度为N+1的整型数阵列(N为矩阵的列数),其中包含的是列号信息。对于任意的j,如果0≤j≥N-1,jc[j]是第j列中第一个非零项在ir、pr(以及pi)中的序号,jc[j+1]-1是第j列最后一个非零项的序号。因此jc[N]总等于nnz——矩阵中非零项的总个数。如果nnz小于nzmax,可以继续向矩阵中添加非零项而无需分配额外的存储空间<

4、主要函数举例:

    ·MATFile *matOpen(const char *filename, const char * mode)——打开/创建
    ·MATFile *matOpen(const char *filename, const char * mode)——打开/创建一个MAT文件;
    ·int matClose(MATFile *pMF)——关闭一个MAT文件;
    ·mxArray *mxCreateDoubleMatrix(int m, int n, mxComplexity flag)
       #创建一个(复)双精度矩阵;
    ·mxArray *mxCreateSparse(int m, int n, int nzmax, mxComplexity flag)
       #创建一个稀疏矩阵;
    ·mxArray *matGetNextArray(MATFile *pMF)——获得MAT文件里面下一个矩阵;
    ·const char *mxGetName(const mxArray *pa)——获得矩阵pa的名称;
    ·void mxSetName(mxArray *pa,const char *s)——为矩阵pa设置一个名称;
    ·int mxGetM(const mxArray *pa)——获得矩阵pa的总行数;
    ·int mxGetN(const mxArray *pa)——获得矩阵pa的总列数;
    ·double *mxGetPr(const mxArray *pa)——获得矩阵pa的pr指针;
    ·int *mxGetIr(const mxArray *pa)——获得稀疏矩阵pa的ir指针;
    ·int *mxGetJc(const mxArray *pa)——获得稀疏矩阵pa的jc指针;
    ·int matPutArray(MATFile * pMF, const mxArray * pA)
     #把矩阵pA存储入MAT文件pMAF;  
    ·void mxDestroyArray(mxArray *pa)——释放矩阵pa(把它从内存中撤销);

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏腾讯AlloyTeam的专栏

png的故事:获取图片信息和像素内容

现在时富媒体时代,图片的重要性对于数十亿互联网用户来说不言而喻,图片本身就是像素点阵的合集,但是为了如何更快更好的存储图片而诞生了各种各样的图片格式:jpeg、...

1.8K0
来自专栏深度学习计算机视觉

A HierarchicalTest Case Prioritization Technique for Object Oriented Software

1、成员组成 (1)组长:张俊怡 (2)组员:孟令军 2、文献基本情况介绍 (1)文献名称:A HierarchicalTest Case Prioritiz...

3637
来自专栏企鹅号快讯

从图灵机开始

说到图灵机,我们首先要说说图灵这个人。笔者觉得我们这种搞计算机的人都应该知道并记得这个人。 图灵,1912年6月23日生于英国帕丁顿。是数学家、密码破译专家,当...

2178
来自专栏机器学习算法工程师

实例介绍TensorFlow的输入流水线

在训练模型时,我们首先要处理的就是训练数据的加载与预处理的问题,这里称这个过程为输入流水线(input pipelines,或输入管道,[参考:https://...

3376
来自专栏机器之心

资源 | HiddenLayer:可视化PyTorch、TensorFlow神经网络图的轻量级工具!

GitHub链接:https://github.com/waleedka/hiddenlayer

1702
来自专栏程序员互动联盟

二维码是如何实现的?

二维条码是指在一维条码的基础上扩展出另一维具有可读性的条码,使用黑白矩形图案表示二进制数据,被设备扫描后可获取其中所包含的信息。一维条码的宽度记载着数据,而其长...

3505
来自专栏章鱼的慢慢技术路

层层递进——宽度优先搜索(BFS)

2454
来自专栏人工智能LeadAI

用TensorFlow的Linear/DNNRegrressor预测数据

今天要处理的问题对于一个只学了线性回归的机器学习初学者来说还是比较棘手——通过已知的几组数据预测一组数据。用excel看了下,关系不是很明显,平方,log都不是...

1111
来自专栏机器学习从入门到成神

Python3读取深度学习CIFAR-10数据集出现的若干问题解决

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sinat_35512245/articl...

1352
来自专栏三十课

基于规则评分的密码强度检测算法分析及实现(JavaScript)

用正则表达式做用户密码强度的通过性判定,过于简单粗暴,不但用户体验差,而且用户帐号安全性也差。那么如何准确评价用户密码的强度,保护用户帐号安全呢?本文分析介绍了...

6016

扫码关注云+社区

领取腾讯云代金券