Matlab中mex与C混合编程总结

Matlab调用Cuda程序 matlab编译cuda 工程生成可执行文件 阅读详情

使用mex和C可以加快算法的运行速度,mex文件包含一个入口函数如下:

void mexFunction( int nlhs, mxArray *plhs[],int nrhs, const mxArray *prhs[] ) 
入口函数有四个参数:prhs为mxArray结构体类型的指针数组,该数组的元素按顺序指向所有的输入参数;
nrhs为整数类型,它标明了输入参数的个数。
plhs:为mxArray结构体类型的指针数组,该数组的元素按顺序指向所有的输出参数;
nlhs:输出参数的个数

在入口程序完成两件事情:第一:从输入的mxArray结构体中获得计算完毕的数据,然后在用户的子程序中加以使用
第二:用户可以将计算完毕的结果返回给一个用于输出的mxArray结构体。
mex源文件的两个组成部分可以分为两个文件也可以放在一个文件中,必须包含mex.h头文件,该头文件包含matrix.h和一些
以mex开头的子函数。

下面举几个例子:

#include "mex.h"
/* 输入参数 */


#define	MInput	prhs[0]     
/* 输出参数 */


#define OUTM	plhs[0]


void mexFunction( int nlhs, mxArray *plhs[],
	     int nrhs, const mxArray *prhs[] ) 
         {
            int i,j,N,L;
            double *Input,*output;
   
         if (nrhs < 1)  
         {
    mexErrMsgTxt("至少需要一个参数!");
           }
        Input= mxGetPr(MInput); /*获取矩阵*/  
N = mxGetM( MInput ); /*获取矩阵的行*/
L = mxGetN( MInput); /*获取矩阵的列*/
for( i=0;i<N;i++) /*一行一样输出*/
{
    for ( j=0;j<L;j++)
     printf("%f ", Input[i+j*N]);/*若索引从1开始则变成i-1+(j-1)*N MATLAB 是按列存数据 */ 
          printf("\n"); /*输出完一行,换行*/
}
    
 OUTM= mxCreateDoubleMatrix(N,L, mxREAL); /* 建立输出矩阵*/
 output=mxGetPr(OUTM);
  for( i=0;i<N;i++) /*一行行的赋值*/
{
    for ( j=0;j<L;j++)
    output[i+j*N]=Input[i+j*N];/*若索引从1开始则变成i-1+(j-1)*N*/
        
}
  }

下面是字符串的操作:

#include "mex.h"
   
void
mexFunction(int nlhs,mxArray *plhs[],int nrhs,const mxArray *prhs[])
{
    char *buf;
    mwSize buflen;
    int status;

    (void) plhs;    /* unused parameters */
    
    /* Check for proper number of input and output arguments */
    if (nrhs != 1) { 
	mexErrMsgTxt("One input argument required.");
    } 
    if (nlhs > 1) {
	mexErrMsgTxt("Too many output arguments.");
    }
    
    /* Check for proper input type */
    if (!mxIsChar(prhs[0]) || (mxGetM(prhs[0]) != 1 ) )  {
	mexErrMsgTxt("Input argument must be a string.");
    }
    
    /* Find out how long the input string is.  Allocate enough memory
       to hold the converted string.  NOTE: MATLAB stores characters
       as 2 byte unicode ( 16 bit ASCII) on machines with multi-byte
       character sets.  You should use mxChar to ensure enough space
       is allocated to hold the string */
    
    buflen = mxGetN(prhs[0])*sizeof(mxChar)+1;
    buf = mxMalloc(buflen);
    
    /* Copy the string data into buf. */ 
    status = mxGetString(prhs[0], buf, buflen);   
    mexPrintf("The input string is:  %s\n", buf);
    /* NOTE: You could add your own code here to manipulate 
       the string */
    
    /* When finished using the string, deallocate it. */
    mxFree(buf);
    
}

动态分配内存的例子:

#include "mex.h"

/* The mxArray in this example is 2x2 */
#define ROWS 2
#define COLUMNS 2
#define ELEMENTS 4

void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) {
    double  *pointer;          /* pointer to real data in new array */
    double  *dynamicData;      /* pointer to dynamic data */
    const double data[] = {2.1, 3.4, 2.3, 2.45};  /* existing data */
    mwSize index;

	/* Check for proper number of arguments. */
    if ( nrhs != 0 ) {
        mexErrMsgIdAndTxt("MATLAB:arrayFillGetPrDynamicData:rhs","This function takes no input arguments.");
    } 

    /* Create a local array and load data */
    dynamicData = mxMalloc(ELEMENTS * sizeof(double));
    for ( index = 0; index < ELEMENTS; index++ ) {
        dynamicData[index] = data[index];
    }

    /* Create a 2-by-2 mxArray; you will copy existing data into it */
    plhs[0] = mxCreateNumericMatrix(ROWS, COLUMNS, mxDOUBLE_CLASS, mxREAL);
    pointer = mxGetPr(plhs[0]);

    /* Copy data into the mxArray */
    for ( index = 0; index < ELEMENTS; index++ ) {
        pointer[index] = dynamicData[index];
    }

    /* You must call mxFree(dynamicData) on the local data.
       This is safe because you copied the data into plhs[0] */
    mxFree(dynamicData);
    
    return;
}


在Matlab中使用mex函数进行C/C++混合编程 最近写了个Matlab程序,好慢呐……所以开始学习Matlab与C/C++混合编程。下面写了个测试代码,显示一个Double类型矩阵中的元素。 在Matlab使用mex命令编译源文件时,要注意这样一个现象:源文件名后缀为.c时,所有变量声明必须一次性完成,且放在最前面, 否则mex编译错误;而源文件名后缀为.cpp时,就没有上面的问题,...- -||。 阅读详情

相关推荐

matlab与C混合编程生成.mex文件

今天在网上找了很多关于matlab与C混合编程生成.mex文件,但是都是一些蜻蜓点水式的说法,没有解决根本问题,后来看到这篇帖子:http://paulke.blog.163.com/blog/static/177891560201111281481432/,按照这篇帖子上的步骤走了一遍,最后出现了: mex hello.c   D:\SOFT\MATLAB~3\BIN\MEX.PL: E

szv123_rier的专栏 4278

MATLAB中mexFunction函数的接口规范

void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) nlhs:输出参数数目  plhs:指向输出参数的指针  nrhs:输入参数数目  例如,使用 [a,b]=test(c,d,e) 调用mex函数test时,传给test的这三个参数分别是 prhs[0]=c ,prhs[1]=d ,

坤的专栏 4456

网络变压器等效电路及网络变压器中间抽头作用详解

       华强盛电子导读:要详细了解网络变压器周边EMC管控及网络变压器BOB-SMITH电路的连接原理,首先我们对网络变压器的认识及其电路各参数影响都要有个简要的认识,本文,对非理想网络变压器等效电路做一个详细的分析,其中重点讨论一下网络变压器中间抽头的作用其影响                          网络变压器等效电路及                        ...

网络变压器专业资料 6005

maltab调用C++/C语言

maltab调用C语言 环境搭建 接口函数分析 例子 常用函数 注意事项 搭建环境 VS2015和Matlab2016a 注意点:需要查看maltab的版本和vs的版本是否兼容,以及补丁 接口函数分析 主要函数 void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) { } 这个函数是没有返回值的(void),是通过传递指针的方式改变maltab的值。 其中的lhs(lhs-left hand side)是

weixin_46185705的博客 988

LVGL字体优化实战:如何将中文字库放到外部SPI Flash并动态加载(节省内部RAM)

本文详细介绍了LVGL在嵌入式UI开发中如何通过外部SPI Flash存储中文字库并动态加载,以节省内部RAM资源。通过对比不同存储介质和字库格式,提供多种实现方案及性能优化技巧,帮助开发者在资源受限设备上实现高效的中文显示。

weixin_28693683的博客 342

华为鸿蒙系统也能用!5分钟搞定谷歌三件套安装(附最新APK下载链接)

本文为华为鸿蒙系统用户提供了一份详尽的谷歌三件套(Google Play服务、商店及框架)手动安装指南。文章核心在于无需Root,通过ADB命令获取设备信息,并从可靠来源下载匹配版本的APK,按照正确顺序安装,从而解决海外应用依赖问题,实现5分钟快速部署。

c7d8e9的博客 6463

[Matlab] mex混编OpenCV

最近需要用到Matlab C++混编,研究了一下Matlab中混编C++版本OpenCV的方法。 例子是opencv中sample里的一个em算法,mex_em.cpp,核心的mexFunction函数内容如下,必须严格按照mex要求编写  void mexFunction( int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]

kernlen的专栏 6190

Delta-Sigma调制(DSM)技术

前言 数字信号处理和通信系统的性能很大程度上受到了模拟信号到数字信号转换接口——ADC的精度和分辨率的限制。而传统的线性脉冲编码调制(PCM)ADC受到了制造工艺的限制,无法达到很高的分辨率。但基于Delta-Sigma调制技术的ADC可以在现有工艺下实现高分辨率(大于16位),同时由于结构简单,所以易于实现。低成本高性能使得Delta-Sigma调制技术得到了广泛的应用。 Delta-Sigma型ADC的结构原理图如下图所示: 它最大的优势在于仅用1位ADC进行数据转换,同时其模拟电路部分结构简单不需要

阿星的博客 2万+

matlab跟c 交互,MATLAB与C/C++混合编程之MATLAB调用C程序

为了让大家能更直观地了解参数传递的过程,我们把hello.c改写一下,使它能根据输入参数的变化给出不同的屏幕输出://hello.c 2.0#include "mex.h"void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]){int i;i=mxGetScalar(prhs[0]);if(i==1)...

weixin_42531779的博客 516

120、NPU的Mythic M1076:模拟存算一体NPU

这篇文章分享了作者调试Mythic M1076模拟存算一体NPU的实战经验,主要包含以下要点: 硬件设计陷阱:参考电压输入必须使用低ESR电容,普通贴片电容会导致模拟计算阵列工作异常。 核心技术原理: 采用真正的存算一体架构,将权重存储为模拟电压 使用浮栅晶体管存储权重,通过电流叠加实现乘法运算 包含108个计算单元阵列(Tile),每个256×256规模 使用注意事项: 编程模型特殊,需要依赖SDK自动映射网络层 存在6-8位有效精度限制,需用量化感知训练 功耗特性独特,静态偏置电流占主要功耗 调试手段有

m0_50546716的博客 122

华为od 面试八股文_Python语言_01_含答案

华为od 面试八股文_Python语言_01_含答案

MISAYAONE的博客 9092

mex matlab混编,Matlab中mex与C混合编程总结

使用mex和C可以加快算法的运行速度,mex文件包含一个入口函数如下:c}%Qe7L$vIln%J0void mexFunction( int nlhs, mxArray *plhs[],int nrhs, const mxArray *prhs[] )51Testing软件测试网6X{+vB7a!f7_)G51Testing软件测试网~%h$GT)X7s Zj3K/m入口函数有四个参数:prhs...

weixin_39624094的博客 897

如何使用Python爬取并保存网页上的所有附件

爬虫(Crawler)是一种自动化程序,它通过模拟人工访问网页并下载网页上的数据或文件,常用于数据采集和分析。爬虫通常以“爬取”的形式自动浏览和提取网页中的各种信息。本文详细介绍了如何使用Python爬取并保存网页中的附件文件,涵盖了网页解析、文件下载、多线程与异步优化等内容。希望通过本文的讲解,能够帮助你理解并掌握附件爬取的技巧。在实际应用中,爬虫开发不仅需要解决技术问题,还要遵守网络道德和法律法规,避免不当使用爬虫造成负面影响。

2201_76125261的博客 965

matlab/C混合编程--mex文件的编写、编译、调用

matlab程序计算速度太慢,特别是面对大量循环的时候。经测试,11k个面的规模的mesh,用matlab求mass properties需要0.45s,而同样的程序用C实现,在release模式下仅需要2ms。因此如果能将复杂计算、循环用C包装起来,用matlab调用,可以极大地提高运算速度。 matlab配置C编译器          打开matlab,输入: mex –setup 可

子宽的专栏 7385

Python 爬虫实战:爬取哔哩哔哩知识区,抓取高赞课程信息

哔哩哔哩(Bilibili)是一个广受欢迎的综合性视频社区,其中的知识区汇聚了大量优质的教育、科普、技术等课程内容。本文将指导读者如何使用 Python 爬虫技术从哔哩哔哩知识区抓取高赞课程信息,并进行数据分析。本文深入探究了利用 Python 爬虫技术从哔哩哔哩知识区抓取高赞课程信息的全流程。从前期的环境搭建、模拟登录,到核心的课程数据抓取、存储,再到后续的数据分析与可视化,都详细展开讲解并提供代码支持。通过此方法所获取的数据,能够助力创作者优化内容、用户发现优质课程、平台洞察用户需求。

u014481728的博客 1134

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

MATLAB 与C混合编程:通过mex提高运行速度

把耗时的函数(尤其是包含大量循环)用c语言实现,并编译成mex函数可以加快执行速度。 Matlab本身是不带c语言的编译器的,所以要求你的电脑上已经安装有VC6.0或Visual Studio或其他编译器。 在Matlab的Command Window里键入mex -setup,根据提示一步步设置就可以了。(似乎只用设置一次,以后就可以直接用了)。

林涛的博客 4177

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

matlab和C/C++混合编程--Mex

最近的项目需要matlab和C的混合编程,经过一番努力终于完成了项目要解决的问题。现在就将Mex的一些经验总结一下,当然只是刚刚开始,以后随着学习的深入继续添加。首先讲讲写Mex的一些常规规定,然后我们会重点关注混合编程中最难解决数据的问题--结构到底如何转换,并且后面会重点说一下自己的程序。 一、Mex的结构 先看一个简单的程序(该程序保存在matlab主目录下名字是mexDemon

a503604的专栏 1222

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

c 与传递数据MATLAB,matlab和C/C++混合编程--Mex (转载)

最近的项目需要matlab和C的混合编程,经过一番努力终于完成了项目要解决的问题。现在就将Mex的一些经验总结一下,当然只是刚刚开始,以后随着学习的深入继续添加。首先讲讲写Mex的一些常规规定,然后我们会重点关注混合编程中最难解决数据的问题--结构到底如何转换,并且后面会重点说一下自己的程序。一、Mex的结构先看一个简单的程序(该程序保存在matlab主目录下名字是mexDemon.cpp,或者在...

weixin_33461476的博客 639

关于Matlab的MEX技术 10分钟教会你简单的matlab和C/C++混合编程(mex文件)

10分钟教会你简单的matlab和C/C++混合编程(mex文件) 标签: matlabmexcc++ 2015-05-07 18:40 379人阅读 评论(0) 收藏 举报 本文章已收录于: 分类: Matlab(4) 作者同类文章X 版权声明:本文为博主原创文章,未经博主允许不得转载。

autumn20080101的专栏 2439

matlab和C/C++混合编程--Mex (六)参数传递

最近的项目需要matlab和C的混合编程,经过一番努力终于完成了项目要解决的问题。现在就将Mex的一些经验总结一下,当然只是刚刚开始,以后随着学习的深入继续添加。首先讲讲写Mex的一些常规规定,然后我们会重点关注混合编程中最难解决数据的问题--结构到底如何转换,并且后面会重点说一下自己的程序。 一、Mex的结构 先看一个简单的程序(该程序保存在matlab主目录下名字是mexDemon

pursh0000的博客 1万+

matlab与c混合编程: 注释导致mex编译链接失败例子

最近在学习matlab和c的混合编程。http://hi.baidu.com/dudasunny/blog/item/bef4793131880b19eac4af71.html上把一个简单的例子拷过来,起名mextest.c,然后用mex编译,报错 Error: Link of mextest.mexw32 failed. 我的mex用的是lcc编译器。尝试换到

heavywater的专栏 2218
上一篇: 用JS验证输入框只能输入数值型数据
下一篇: Linux 命令输入输出重定向。。。
xiaoding133
博客等级 码龄19年 415粉丝 159原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值