0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

几个Matlab编程中常用的优化技巧

电子设计 来源:电子设计 作者:电子设计 2022-02-08 15:18 次阅读

作者:猫叔来源:科学计算Tech微信公众号

用过Matlab的同学应该都知道,Matlab的慢是出了名的,但是再慢也有优化的方式,下面我们给出几个Matlab编程中常用的优化技巧。

在讲优化方法之前,首先要说的就是Matlab中用tic toc的方式来计算运行时间,这是个常识。当然,想统计具体的耗时,可以用profile工具。

1. 向量化操作

这个应该是用过Matlab的同学都清楚的一点,Matlab中操作向量和矩阵的速度要比使用for循环的速度快很多,是因为其底层调用了高性能线性代数库BLAS库和LAPACK库。这个就不多说了。

2. 内存预分配

在Matlab中我们可以定义一个空矩阵

mtx = [];

然后后面再给它加入一些数据,而且这个矩阵大小可以随着我们填入数据的多少而变化。像下面这个程序

tic n = 1000; mtrx = []; init = 1.0; for i = 1:n for j=1:n mtrx(i,j) = init + 1.0; end end toc

这个程序的运行时间是多久呢?在我电脑上是0.2秒。

那这个程序有什么问题呢?就是我们没有为这个矩阵分配一个内存空间,而且在循环中,矩阵大小是变化的,这就导致每次循环时都浪费额外的时间去寻找满足需求的内存空间,将改变大小后的矩阵整体移动到这个新的内容空间中,并释放原来的内存空间,这除了会影响代码的运行效率,还容易形成内存碎片,让程序越来越难找到满足条件的内存。

因此在循环前给矩阵预分配内存是很一个良好的习惯,如果没有这个习惯,你还可以通过Matlab自带的代码检查器来查看是否存在类似问题。

所以,我们应该把程序修改如下:

tic n = 1000; mtrx = zeros(n,n); init = 1.0; for i = 1:n for j=1:n mtrx(i,j) = init + 1.0; end end toc

这个程序只用了0.007秒的时间就运行完成了,可见它们的差距有多大。

3. 按列存储

Matlab中默认是按列存储的,也就是说,列向量在内存中是连续排列的,对连续的数据做处理肯定是要快的,所以我们在定义向量时一般都会使用列向量。下面对比矩阵中对行做操作和对列做操作花费的时间。

n = 10000; mtrx = rand(n,n); mcol = zeros(n,1); mrow = zeros(1,n); tic for i=1:n mcol(i) = sum(mtrx(:,i)); end toc

我们对矩阵中的每一列都求和,总共用了0.17秒。

tic for i=1:n mrow(i) = sum(mtrx(i,:)); end toc

再对矩阵中的每一行求和,用了0.8秒。
可以看出,对列操作比对行操作速度要快很多。

4. 数据类型

在Matlab中,数据类型默认是double型,对使用者来说,无需太多关心数据类型当然是省心省力的,但这也带来了一个问题就是double型占用的内存较多,还有可能拖慢程序的运行速度。所以,在适当的情况下,我们可以把数据类型选择为逻辑型、字符型、整型等。但这样还需要注意的一点是,一个变量在改变数据类型时会消耗额外的时间,因此还不如重新建一个新变量。

高效编程的内容就先写这么多,后面还会继续补充。下面说一个Matlab调试中断点设置问题。在一个for循环中,比如for i=1:n,我们想在i=100的进入断点,这个时候应该怎么用?以前的时候我们都会这么写。

for i=1:n if(i==100) pass end end

把断点设置在pass处,但其实不用这么弄。Matlab中提供了条件断点的设置方式。在循环中右键选择设置条件断点。

Figure 1. 条件断点设置1

在下面的窗口中填入条件即可,比如i==100。

Figure 2. 条件断点设置2

这样,当程序运行到i==100时就会进入断点,不需要自己再写额外的语句。

审核编辑:何安

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • matlab
    +关注

    关注

    181

    文章

    2960

    浏览量

    230004
收藏 人收藏

    评论

    相关推荐

    labview中常用的程序结构有哪几种

    和逻辑的关键,以下是LabVIEW中常用的几种程序结构: 顺序结构(Sequential Structure) 顺序结构是最简单的程序结构,它按照从上到下、从左到右的顺序执
    的头像 发表于 09-04 16:32 501次阅读

    简述socket编程中的常用函数

    Socket编程是一种基于TCP/IP协议的网络编程技术,它允许应用程序通过网络进行通信。在Socket编程中,有许多常用的函数,它们用于创建、配置、连接、发送和接收数据等操作。以下是
    的头像 发表于 08-16 10:49 261次阅读

    华为设备中常用的RIP命令及其应用

    RIP(Routing Information Protocol,路由信息协议)是一种应用广泛的距离矢量路由协议,尤其适用于中小型网络。本文将详细介绍在华为设备中常用的RIP命令及其应用,以帮助网络管理员和工程师更好地理解和配置RIP协议。
    的头像 发表于 08-12 18:10 539次阅读

    嵌入式系统中常用的五种微处理器类型

    本文介绍了嵌入式系统中常用的五种微处理器类型:微处理器单元(MPU)、微控制器(MCU)、数字信号处理器(DSP)、现场可编程逻辑门阵列(FPGA)和单片机(SBC)。文章详细阐述了每种处理器的功能、优点、缺点以及选择建议,并列出了一些精选的微处理器产品,供读者参考。
    的头像 发表于 07-25 09:29 1472次阅读

    如何使用MATLAB创建预测模型

    在这篇文章中,我们将讨论如何使用MATLAB创建预测模型。MATLAB(矩阵实验室)是一种用于数值计算、可视化和编程的高级编程语言和交互式环境。它广泛应用于工程、科学研究和金融领域。
    的头像 发表于 07-11 14:29 587次阅读

    matlab预测模型有哪些

    环境,使其成为预测模型开发和实现的理想平台。本文将详细介绍MATLAB中常用的预测模型及其应用。 线性回归模型 线性回归是一种简单的预测模型,用于分析两个或多个变量之间的线性关系。在MATLAB中,可以使用 regress 、
    的头像 发表于 07-11 14:27 654次阅读

    机器视觉中常用的光源类型及优点?

    中常用的光源类型及其优点。 一、LED光源 优点 (1)高亮度:LED光源具有高亮度,能够提供足够的光线,使图像更加清晰。 (2)低能耗:LED光源的能耗较低,能够降低整个系统的运行成本。 (3)长寿命:LED光源的使用寿命较长,一
    的头像 发表于 07-04 10:28 471次阅读

    PLC常用编程语言有哪些

    语言多种多样,每种语言都有其独特的特点和适用场景。本文将详细介绍PLC常用编程语言,包括梯形图(LD)、指令表(IL)、功能模块图(FBD)、顺序功能流程图(SFC)以及结构化文本(ST),并通过具体的特点和应用实例,帮助读者更好地理解和选择适合的
    的头像 发表于 06-14 16:58 1077次阅读

    MATLAB信号处理常用函数详解

    MATLAB是一款功能强大的数学软件,尤其在信号处理领域,它提供了众多的函数和工具箱,使得信号的分析、处理、仿真变得简单而高效。本文将详细介绍MATLAB在信号处理中常用的函数,并通过具体示例来阐述其应用。
    的头像 发表于 05-17 14:31 1549次阅读

    分享几个嵌入式中常用的GUI

    交互,完成各种操作,可提高工作效率以及用户体验。接下来看一下我们开发中常用的GUI框架有哪些吧~二、开源轻量级显示框架LVGLLVGL(LightandVersat
    的头像 发表于 04-06 08:09 1323次阅读
    分享<b class='flag-5'>几个</b>嵌入式<b class='flag-5'>中常用</b>的GUI

    gis中常用的空间分析方法

    GIS中常用的空间分析方法 GIS(地理信息系统)是一种用于收集、存储、处理、分析和展示地理数据的技术。空间分析是GIS的核心部分,它包括一系列方法和技术,用来研究地理空间数据之间的关系和模式。本文
    的头像 发表于 02-25 13:44 4814次阅读

    编程逻辑器件的优化过程主要是对什么进行

    编程逻辑器件(Programmable Logic Device,简称PLD)的优化过程主要是对电路布局、逻辑设计、时序建模和资源利用等方面进行优化。下面,我将详细介绍这些方面的优化
    的头像 发表于 02-01 16:41 574次阅读

    电子电路中常用的元器件

    电容器、三极管和二极管是电子电路中常用的元器件,它们可以搭配使用以实现各种功能。下面将详细介绍它们的搭配使用方法和使用规范。 一、电容器 电容器是一种能够存储电荷的被动元件,主要用于储存
    的头像 发表于 12-29 14:47 747次阅读

    java中常用的包有哪些

    Java是一种面向对象的高级编程语言,它具有平台无关性和可扩展性。Java中有很多常用的包,这些包提供了丰富的类库和工具,用于开发各种类型的应用程序。下面是Java中一些常用的包
    的头像 发表于 11-22 15:10 1283次阅读

    超声波测厚一定得用matlab编程吗?

    测厚一定得用matlab编程吗?求一份超声波测厚的C51程序。
    发表于 11-09 06:52