matlab 如何使用mex

2023-05-16

MATLAB与C语言混合编程接口
MATLAB是一种解释性语言,不需要编译,调试比较方便,但是缺点是速度慢。这一点在执行复杂的科学算法的时候体现极为明显。而C语言虽然相对比 较复杂,但是执行效率很高,MATLAB很多内置函数都是用C写的。另外有时候很多算法已经已C语言的形式写好,于是我们会想到是否有方法将C语言代码与 MATLAB连接起来。MATLAB提供一个C语言中的MEX函数库,可以实现以上功能。这里以一个最简单的例子来说明。

我们的目标是:用C语言写一个加法函数add(),在MATLAB中输入c=add(a,b)可以得到a与b的和。

这个示例是否有点白痴?c=a+b不就完了?这里只是一个示例而已,把最基本的环节解释清楚就够了。

我们要做的是

在MATLAB当目录中建立一个add.c文件;
用你熟知的C语言写一个add()函数;
利用mexFuncion()函数创建C与MATLAB的接口;
从MATLAB命令窗口中编译add.c文件为MEX文件;
MATLAB命令窗口中使用add()函数。
建立add.c文件
这个文件被称为Source MEX-File

在当前文件夹窗口中新建一个脚本:右键单击空白处,选择New File,选择Script
重命名文件为add.c
用外部编辑器打开add.c
编辑add.c文件
MATLAB提供一个函数库,保存在mex.h中,所以文件一开始要将其include:

1

include “mex.h”

然后用你熟知的C语言写一个函数吧

1
2
3
double add(double x, double y) {
return x + y;
}
这段代码被称作Computational Routine,就是真正的算法实现的地方。

然后我们来建立其与MATLAB的间接口。MEX函数库里有个mexFunction()函数,它相当于C语言中的main()函数。所以这里我们知道了MEX源文件没有main(),而是以一个mexFunction()代替。

mexFunction的参数是这样的:

1
2
3
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) {
//这里是正文
}
其中nlhs (number of left-hand side) 是输出参数的个数,nrhs (number of right-hand side) 是输入参数的个数。例如对于c=add(a,b),有 nlhs=1,hrhs=2。

plhs[]与prhs[]都是指针数组,也就是说它是个数组,每个元素都是一个指针,这些指针指向的东东的类型是mxArray。那什么是mxArray呢?可以把他理解MATLAB中的矩阵,因为MATLAB中所有数据都是以矩阵的形式保存的。

先讲prhs[],就是输入的参数,prhs[0]指向a,prhs[1]指向b,但是注意不能用*(prhs[0])得到a的值。因为 prhs[0]指向的东西的类型是mxArray(参数列表里看出),想把它的值以我们常用的数值形式赋给一个标量(Scalar),得使用 mxGetScalar()函数转化一下:

1
2
3
double a, b;
a = mxGetScalar(prhs[0]);
b = mxGetScalar(prhs[1]);
plhs对应的输出的内容。plhs[0]这个指针指向输出的第一个参数,就是c=add(a, b)中的c了。记住这个c应该是以mxArray的类型出现的,为了得到mxArray类型的输出量,要使用 mxCreateDoubleMatrix()函数,它创建一个指向mxArray类型的指针。

1
plhs[0] = mxCreateDoubleMatrix(1, 1, mxREAL);
参数(1, 1, mxREAL)定义了对应c的尺寸类型,MATLAB中c是以1×1的实数矩阵形式报保存的。

而使用mxGetPr()函数可以得到plhs[0]指向的mxArray的第一个double类型的指针。

1
2
double *c;
c = mxGetPr(plhs[0]);
最后调用add()函数

1
*c=add(a,b);
完整代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

include “mex.h”

double add(double x, double y) {
return x + y;
}

void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) {
double a, b;
a = mxGetScalar(prhs[0]);
b = mxGetScalar(prhs[1]);

plhs[0] = mxCreateDoubleMatrix(1, 1, mxREAL);

double *c;
c = mxGetPr(plhs[0]);

*c=add(a,b);

}
编译add.c文件为MEX文件
在MATLAB命令窗口中输入

1
mex add.c
回车后MATLAB会调用编译器把源程序编译成为MEX文件。
注意如果是在MAC OS X下提示gcc 4.0 Command not found之类的错误信息,则需要安装Xcode。

执行c=add(a,b)
在MATLAB命令窗口中输入

1
c=add(1, 2)
回车后可以得到结果。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

matlab 如何使用mex 的相关文章

  • 0.1+0.2不等于0.3 原因

    在计算机进行数字计算时会先将十进制转化为二进制进行计算 xff0c 由于二进制表示的有限数字不能超过 52 位在 JavaScript 里是不能精确存储的 xff0c 计算机进行了四舍五入这时造成了数字误差导致计算结果不为0 3 总结 xf
  • mac 终端 配置代理

    即使打开代理 xff0c mac终端默认不走 xff0c 需要配置 一 复制终端代理命令 export http proxy 61 http 127 0 0 1 1089 export https proxy 61 http 127 0 0
  • 【linux】安装Linux的交叉编译工具链

    1 linux中装软件的特点 linux中安装软件比windows中复杂 linux中安装软件一般有以下几种方法 xff1a 第一种 xff1a 在线安装 譬如ubuntu中使用apt get install vim来安装vim软件 第二种
  • 基于STM32F429 的 FreeRTOS 环境下 LCD1602驱动实现

    本文是基于STM32F429在FreeRTOS下的HAL库开发 xff0c 并验证在多任务不同优先级情况下运行情况 LCD1602介绍 xff1a 是一个只能显示字母 数字 符号的点阵型液晶模块 一行可以显示16个字符 xff0c 可以显示
  • 查询MYSQL和查询HBASE速度比较

    MySQL xff0c 关系型数据库 xff1b HBase xff0c NoSql数据库 查询Mysql和查询HBase xff0c 到底哪个速度快呢 xff1f 与一些真正的大牛讨论时 xff0c 他们说HBase写入速度 xff0c
  • Office Online Server 在线编辑Office文档,安装部署

    最近公司项目需求 xff0c 需要搭建一个office预览编辑的服务 xff0c 在网上找到了Office Online Server在线编辑office文档 xff0c 以下把自己搭建过程记录 一 Office Online Server
  • 安装vmware搭建k8s集群(亲试无坑)

    一 前言 下面这个坑我也遇到了 xff0c 同时看到别人的博客也遇到了 xff0c 害的我废了一天的时间来解决这个问题 xff0c 但是毫无卵用 xff0c 气的我快吐血 xff1a 问题 xff1a 因为k8s把版本的问题 xff0c 一
  • Kaniko构建镜像

    一 前言 最近公司重构devops相关的一系列平台 xff0c 对于流水线中用容器方式交付的产品越来越多 xff0c 为了更加安全的方式来构建容器镜像 xff0c 采用Kaniko构建 在了解如何用Kaniko构建镜像之前 xff0c 我们
  • Mysql批量插入对比(附github仓库demo)

    前言 本文记录个人使用MySQL插入大数据总结较实用的方案 xff0c 通过对常用插入大数据的4种方式进行测试 xff0c for循环单条拼接SQL批量插入saveBatch 循环 43 开启批处理模式 最近趁空闲之余 xff0c 在对My
  • docker内部如何访问宿主机上的服务或者应用

    背景 在docker启动的容器中需要访问宿主机上的服务 xff0c 所以在容器中通过localhost或者127 0 0 1 但是这样是不行的 访问url xff1a http 127 0 0 1 8088 或者http localhost
  • Kruise Rollout v0.3.0:手把手教你实战操作Deployment 分批发布和流量灰度

    helm3 安装 kubectl版本 xff1a v1 20 9 heml版本 xff1a v3 1 2 span class token punctuation span root 64 k8smaster peishunwu span
  • Spring boot 读取配置文件(application.yml)中的属性值

    1 引入依赖 span class hljs comment lt 支持 64 ConfigurationProperties 注解 gt span span class hljs tag lt span class hljs title
  • Apollo配置中心介绍

    一 背景 最近公司订单中心重构 xff0c 利用spring boot集成apollo配置中心 xff0c 因此学习一下apollo配置中心 因为如今程序功能越来越复杂 xff0c 程序的配置日益增多 xff1a 各种功能的开关 参数配置
  • 前端工程化-loader机制

    前言 xff1a loader是用来加载处理各种形式的资源 xff0c 本质上是一个函数 xff0c 接受文件作为参数 xff0c 返回转化后的结构 loader 用于对模块的源代码进行转换 loader 可以使你在 import 或 加载
  • Java中大量数据批量处理方式

    在订单中心处理订单 xff0c 总会遇到大批量订单处理的业务 xff0c 下面就将如何大批量处理数据来提高效率做一个总结 xff1b 代码设计 xff1a 在dao层写批量新增的方法 以及实现dao的实现类 xff0c 在service调用
  • java 获取视频的时长、大小、格式等信息

    1 最近有一个小的视频处理需求 xff0c 根据传入视频的url获取视频的时长 大小 格式等信息 下面将记录一下 xff1a package Void 64 Author psw 64 Description 获取视频宽高大小时间工具类 i
  • Linux下安装Anaconda3详细教程

    简介 Anaconda是一个开源的包 环境管理器 xff0c 可以用于在同一个机器上安装不同版本的软件包及其依赖 xff0c 并能够在不同的环境之间切换 Anaconda包括Conda Python以及一大堆安装好的工具包 xff0c 比如
  • keil下载出现错误Error:Flash Download failed -“Cortex-M3”问题

    在基本确认配置都正确的情况下 xff0c 可以试一下先擦除flash再下载程序 xff0c 一次不成功可以多擦除几次 本人就是这样解决的 分界线 更新博客 xff1a 前面解决方法
  • 《华为机试》刷题之HJ39 判断两个IP是否属于同一子网

    一 题目 描述 IP地址是由4个0 255之间的整数构成的 xff0c 用 34 34 符号相连 二进制的IP地址格式有32位 xff0c 例如 xff1a 10000011 xff0c 01101011 xff0c 00000011 xf
  • camera调试:i2c不通如何排查?

    这篇文章介绍一下在调试camera驱动的过程 xff0c 最常见的一个问题 xff0c i2c不通导致驱动注册不上 xff0c 应该如何排查 常见的报错log如下 xff1a 1 973566 T1 gc8034 4 0037 driver

随机推荐

  • Linux上好用的截图工具——flameshot

    我在windows上习惯了QQ的Ctrl 43 Alt 43 A截图 xff0c 在linux也想拥有这样愉快截图的体验 xff0c flameshot无疑是一个比较好的选择 flameshot的功能 xff1a 绘画 直线箭头矩形框实心矩
  • Linux下Zsh安装并配置

    Oh My Zsh 是基于 zsh 命令行的一个扩展工具集 xff0c 提供了丰富的扩展功能 本文使用的乌班图系统版本为16 04 一 下载安装zsh 1 首先点击这里下载最新的zsh源码 然后将源码包复制到 usr local目录下 xf
  • vnc viewe连接,同时ubuntu系统显示灰屏解决方案,不显示命令行和菜单栏解决方法

    span class token number 1 span 在Ubuntu上首先需要安装vnc4server span class token macro property apt get install vnc4server span
  • ROS的可视化工具 rviz 的安装与运行

    1 安装rviz sudo apt get install ros kinetic rviz 然后环境检测 安装 rosdep install rviz rosmake rviz 2 运行rviz 打开一个linux终端 xff0c 输入
  • STM32生成互补PWM波(输出前均为低电平)

    STM32的定时器功能很多 xff0c 今天介绍一下生成互补PWM波形 STM32高级定时器1和8的时钟是168MHZ 通用定时器通常是84MHZ 频率通用设置 定时器时钟频率设置的通用写法 一般我们都是设置两个参数 xff0c 分频系数和
  • 解决ubuntu上的samba共享无法被windows访问问题

    年后回来发现自己ubuntu服务器的samba共享访问不了了 先来看看samba的log记录的啥 root cat var log samba log smbd 2022 02 14 09 19 46 514611 0 lib util f
  • Android仿微信未读消息数提示数字之BadgeView的使用

    没事在整理以前上班收藏的一些笔记 xff0c 发现其中的关键字部分有个 BadgeView 不知道是什么东东 xff0c 于是乎搜了下 xff0c 发现也是一个项目中很常用的功能 比如 xff1a 这样的 xff0c 很常见 这是官方的de
  • cocos creator 游戏背景音乐处理(音乐循环淡入淡出等)

    在处理游戏背景音乐中遇到的问题 xff0c 策划对于音乐播放提出新的想法 但由于目前周围没有人尝试过 xff0c 所以自己摸索的来 需求 在同一场景音乐处理 一般同一场景是同一首背景音乐 现需求在同一场景 xff08 时代 xff09 内播
  • Linux 进程状态D Disk Sleep

    Linux进程状态 xff1a S TASK INTERRUPTIBLE xff0c 可中断的睡眠状态 处于这个状态的进程因为等待某某事件的发生 xff08 比如等待socket连接 等待信号量 xff09 xff0c 而被挂起 这些进程的
  • 两个超实用的 Kubernetes 集群中 Flannel 故障排除案例

    自建的 K8s 集群的坑不少 尤其是到了 Node 数量越来越多之后 问题也逐渐显露了出来 博客主要介绍我们使用flannel之后遇到的两个问题以及解决方案 问题其实不严重 只是涉及到了底层的结构 改动时候要小心 问题 1 flannel
  • 解决zsh: command not found问题

    zsh command not found 看字面意思就是找不到这个方法 xff0c 缺少环境变量配置 1 打开zsh配置文件 open zshrc 2 添加缺少的文件路径 PATH 61 34 Users mengmeng Downloa
  • Python两大爬虫库

    文章目录 Python两大爬虫库urllib库urllib库使用urllib request实验案例 xff1a 模拟头部信息 requests库实验案例 get请求实验案例 抓取网页实验案例 响应 在使用Python爬虫时 xff0c 需
  • amixer命令

    简述amixer及其用法 alsamixer是Linux 音频架构ALSA中的Alsa工具的其中一个 xff0c 用于配置音频的各个参数 alsamixer是基于文本下的图形界面的 xff0c 可以通过键盘的上下键 xff0c 左右键等 x
  • 安装ubuntu系统中磁盘分区

    硬件 xff1a vostro 1450 xff0c 本身有一块机械硬盘HDD xff08 500G xff09 加了一块固态硬盘SSD xff08 120G xff09 xff0c 组成HDD 43 SSD双硬盘 目的 xff1a SDD
  • Could not find encoder for codec id 27: Encoder not found

    在detectron2测试demo时出现如题所示问题 xff0c 解决 xff1a 改 xff1a fourcc 61 cv2 VideoWriter fourcc 34 x264 34 为 xff1a fourcc 61 cv2 Vide
  • Ubuntu查看磁盘使用情况

    xff08 1 xff09 查看文件大小 查看当前文件夹下所有文件大小 xff08 包括子文件夹 xff09 du sh du h 15M package 16K fontconfig 4 0K cache 5 1M rpmdb 20M 查
  • 最简单的方式解决ubuntu 16.04 屏幕亮度问题

    本教程不需要修改grub xff08 因为我的ubuntu 没有 sys class backlight intel backlight brightness 这个目录 xff09 xff0c 我也装过brightness indicato
  • 按列合并两个.txt 文件

    一颗行走的大白菜 转载请标明出处 网上给出了好多答案 xff0c 动辄几十行的python 脚本让人好烦 xff0c 然后我们的linux仅仅需要一条命令就能解决 xff1a 先给出截图 xff1a 我要合并read txt read1 t
  • python: np.pad() 函数的用法

    在卷积神经网络中 xff0c 为了避免因为卷积运算导致输出图像缩小和图像边缘信息丢失 xff0c 常常采用图像边缘填充技术 xff0c 即在图像四周边缘填充0 xff0c 使得卷积运算后图像大小不会缩小 xff0c 同时也不会丢失边缘和角落
  • matlab 如何使用mex

    MATLAB与C语言混合编程接口 MATLAB是一种解释性语言 xff0c 不需要编译 xff0c 调试比较方便 xff0c 但是缺点是速度慢 这一点在执行复杂的科学算法的时候体现极为明显 而C语言虽然相对比 较复杂 xff0c 但是执行效