一、首先要熟悉matlab所附带的C语言api 
1、定义mexFunction函数,mexFunction的定义法唯一: 它只能是如下形式: 
void mexFunction( int nlhs, mxArray *plhs[],int nrhs, const mxArray *prhs[] ) 
其名称和参数类型不许有任何改变,在mexFunciton函数中可以调用你刚定义好的C++程序。

2、MATFile matOpen(const char *filename, const char mode)——打开/创建

3、MATFile matOpen(const char *filename, const char mode)——打开/创建一个MAT文件;

4、int matClose(MATFile *pMF)——关闭一个MAT文件;

5、mxArray *mxCreateDoubleMatrix(int m, int n, mxComplexity flag) ——创建一个(复)双精度矩阵;

6、`mxArray *mxCreateSparse(int m, int n, int nzmax,mxComplexity flag) ——创建一个稀疏矩阵;

7、mxArray *matGetNextArray(MATFile *pMF)——获得MAT文件里面下一个矩阵;

8、const char *mxGetName(const mxArray *pa)——获得矩阵pa的名称;

9、void mxSetName(mxArray *pa,const char *s)——为矩阵pa设置一个名称;

10、int mxGetM(const mxArray *pa)——获得矩阵pa的总行数;

11、int mxGetN(const mxArray *pa)——获得矩阵pa的总列数;

12、double *mxGetPr(const mxArray *pa)——获得矩阵pa的pr指针;

13、int *mxGetIr(const mxArray *pa)——获得稀疏矩阵pa的ir指针;

14、int *mxGetJc(const mxArray *pa)——获得稀疏矩阵pa的jc指针;

15、int matPutArray(MATFile * pMF, const mxArray * pA) ——把矩阵pA存储入MAT文件pMAF;

16、void mxDestroyArray(mxArray *pa)——释放矩阵pa(把它从内存中撤销);

二、例子(用C++模拟matlab矩阵相加add.cpp)

#include "mex.h"
#include<stdlib.h>
#include <string.h>
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{double *inData1, *inData2, *outData;int inM1, inN1, inM2, inN2, outM, outN, i, j;//检查输入参数矩阵的个数if (nrhs != 2)mexErrMsgTxt("输入参数必须为2!");else if (nlhs > 2)mexErrMsgTxt("Too many output arguments");//获取输入矩阵的行列inM1 = mxGetM(prhs[0]);inN1 = mxGetN(prhs[0]);inM2 = mxGetM(prhs[1]);inN2 = mxGetN(prhs[1]);outM = (inM1 > inM2) ? inM1 : inM2;outN = (inN1 > inN2) ? inN1 : inN2;mexPrintf("输出行数为:%d\n",outM);mexPrintf("输出列数为:%d\n",outN);//创建输出矩阵plhs[0] = mxCreateDoubleMatrix(outM, outN, mxREAL);//获得输入,输出的头指针inData1 = mxGetPr(prhs[0]);inData2 = mxGetPr(prhs[1]);outData = mxGetPr(plhs[0]);//创建二维数组double **temp1, **temp2,**answer1,**answer2;temp1 = (double **)malloc(sizeof(double *) * inM1);for (i = 0; i < inM1; i++)temp1[i] = (double *)malloc(sizeof(double) * inN1);temp2 = (double **)malloc(sizeof(double *) * inM2);for (i = 0; i < inM2; i++)temp2[i] = (double *)malloc(sizeof(double) * inN2);answer1 = (double **)malloc(sizeof(double *) * outM);for (i = 0; i < outM; i++)answer1[i] = (double *)malloc(sizeof(double) * outN);answer2 = (double **)malloc(sizeof(double *) * outM);for (i = 0; i < outM; i++)answer2[i] = (double *)malloc(sizeof(double) * outN);//标准answer1初赋值为0for ( i = 0; i < outM; i++)for (int j = 0; j < outN; j++)answer1[i][j]=0;for ( i = 0; i < outM; i++)for (int j = 0; j < outN; j++)answer2[i][j]=0;//temp一维变二维   for ( i = 0; i < inM1; i++)for (int j = 0; j < inN1; j++)temp1[i][j] = inData1[j*inM1 + i];//temp2一维变二维for (i = 0; i < inM2; i++)for ( j = 0; j < inN2; j++)temp2[i][j] = inData2[j*inM2 +i];   //temp1二维扩展至标准  {for ( i = 0; i < inM1; i++)for ( j = 0; j <inN1; j++)answer1[i][j] = temp1[i][j];}//temp2二维扩展至标准  {for ( i = 0; i < inM2; i++)for ( j = 0; j <inN2; j++)answer2[i][j] = temp2[i][j];}//标准格式相加,结果输入到answer1for (i = 0; i < outM; i++){for (j = 0; j < outN; j++)answer1[i][j]= answer1[i][j]+ answer2[i][j];}mexPrintf("\n");//释放小数组temp1for ( i = 0; i < inM1; i++){free(temp1[i]);}free(temp1);//释放小数组temp2for ( i = 0; i < inM2; i++){free(temp2[i]);}free(temp2);//释放大数组answer2for ( i = 0; i < outM; i++){free(answer2[i]);}free(answer2);//二维转一维输出!!for (i = 0; i < outM; i++)for (j = 0; j < outN; j++){outData[j*outM+i] =answer1[i][j];}// 释放大数组answer1for ( i = 0; i < outM; i++){free(answer1[i]);}free(answer1);
}

三、编译 
将add.c拷贝至Matlab当前目录,执行mex add.cpp,生成add.mexw64,该文件实现求和功能。此时便可在Matlab中调用该函数

转载于:https://blog.51cto.com/kenneth123/1615067

matlab调用C语言相关推荐

  1. matlab编程是用c语言吗,matlab调用c语言编程.doc

    实用标准文案 精彩文档 matlab与C语言混合编程 用C编写mex程序??大家都知道,matlab是一种解释型的编程环境,也就是说,跟以前的basic一样,是读一句执行一句的.这样做可以很方便的实现 ...

  2. matlab调用c语言驱动函数,[转载]Matlab调用C语言函数

    3.3000 要得出以上的结果,那应该怎样做呢? 解决方法之一是要通过使用MEX文件,MEX文件使得调用C函数和调用Matlab的内置函数一样方便.MEX文件是由原C代码加上MEX文件专用的接口函数后 ...

  3. matlab 如何调用mex文件,matlab调用mex文件报错

    尝试matlab调用c语言,已经编译出了.mexw32文件,无错误,调用此函数,matlab就崩溃,请大神帮忙看看吧! 提示错误如下: Stack Trace (from fault): [  0] ...

  4. python调用c语言内核计算,在Linux上实现Python调用C语言函数

    一般思路 Python中内置ctypes库,需调用c编译成的.so文件来实现函数调用. 假设我们所需调用的c文件名为test.c,文件里有我们需要的函数func(x,y). 将.c文件编译成 .so文 ...

  5. matlab调用c函数语言,MATLAB调用C/C++函数的方法

    8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? 通过MATLAB将C/C++函数编译成MEX函数,在MATLAB中就可以调用了. 1,首先装编译器 Matlab里键入m ...

  6. c语言调用dll实例 结构体传参,Matlab调用Dll,对于自定义结构体数组如何传参? - 程序语言 - 小木虫 - 学术 科研 互动社区...

    %[例子1] % Matlab调用DLL,整形数组传参 v = [1,22,33;44,-56,67]; pv = libpointer('int16Ptr',v); m = get(pv,'Valu ...

  7. matlab识别不出linux链接,在Ubuntu上,从matlab调用外部脚本失败_linux_开发99编程知识库...

    我搜索了很多次,但没有解决这个问题. 我使用系统( )/unix ( ) 从matlab调用外部 R 脚本,并找到共享库的mis加载. 我知道在matlab中环境是错误的. 我还尝试在xterm或者g ...

  8. matlab m语言,我要编写matlab一个公式的m语言,请问错在哪里?,M语言的MATLAB的M语言...

    导航:网站首页 > 我要编写matlab一个公式的m语言,请问错在哪里?,M语言的MATLAB的M语言 我要编写matlab一个公式的m语言,请问错在哪里?,M语言的MATLAB的M语言 匿名网 ...

  9. matlab调用opencv库,matlab调用opencv库

    matlab中有许多图像处理的函数简单方便,比如矩阵x 求垂直积分 直接sum(x) 就可以了.不知道OPENCV里面有没有类似的功能,反正我是没找到.就准备用matlab调用OPENCV里面的函数. ...

  10. matlab调用C程序

    Matlab是矩阵语言,如果运算可以用矩阵实现,其运算速度非常快.但若运算中涉及到大量循环,Matlab的速度令人难以忍受的.当必须使用for循环且找不到对应的矩阵运算来等效时,可以把耗时长的函数用c ...

最新文章

  1. Angular给HTML节点绑定自定义属性和变量,用于设置一些动态的状态变化非常有用!
  2. 台式计算机装电源线,完美:[机箱电源线的连接方法]如何选择台式机电源?组装台式计算机机箱的电源线连接方法图...
  3. PAL算法原理及代码实现
  4. Java 8 - Stream实战
  5. ACM旗舰期刊最新综述:一览端到端人脸识别最新进展
  6. mac solr mysql 配置文件_Solr配置文件浅析
  7. 运用python的方式_对Python使用mfcc的两种方式详解
  8. 【Clickhouse】Clickhouse 多路径存储策略
  9. Find Minimum in Rotated Sorted Array leetcode java
  10. 利用python对excel文件进行操作_数据处理-对Excel文件读取和操作和存储(python版)...
  11. python不会英语不会数学怎么自学-零基础想自学PYTHON如果补数学怎么补?
  12. 柯尔莫哥洛夫最后的问题
  13. edge浏览器被恶意插件劫持,不能删除由组织安装的扩展,提示您的浏览器由您的组织管理
  14. 全量查询与分页查询合二为一的思考
  15. 奇偶数求和:输入任意个正整数(以输入负数表示结束输入),分别求出所有的奇数之和,所有的偶数之和。 示例: 输入格式:1 2 3 4 -1 输出格式:sumodd=4 sumeven=
  16. Google BERT 中文应用之《红楼梦》中对话人物提取
  17. vue 项目中实现pdf预览 pdf打印 pdf下载
  18. 那些可以加速国内外开源库的免费CDN
  19. 初出茅庐的小李第114篇博客项目笔记之机智云智能浇花器实战(3)-基础Demo实现
  20. 如何删除流氓弹窗广告(全民仙战)

热门文章

  1. Win10 无法保存对hosts权限所作的更改 拒绝访问
  2. Thinkphp5 接口中直接返回数组提示variable type error: array
  3. PHP token检验
  4. jq 目录树ajax,javascript
  5. php留言板验证验证码,留言板7 图形验证码
  6. 2022 github新建账号技巧
  7. 总有被遗忘或者没有及时跟进的工作
  8. UOS开启开发者模式
  9. 联合国应考虑建设第二总部
  10. 今年纽微特公司股东会不开了?