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
    +关注

    关注

    189

    文章

    3018

    浏览量

    237601
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    请问Keil的优化等级到底该如何选择?

    能、资源占用和开发效率的关键。Keil MDK通常提供以下几个主要的优化等级选项。 -O0 (无优化 / Optimization Level 0): 目标: 提供最佳的调试体验。 行为: 编译器几乎不
    发表于 11-20 07:51

    蜂鸟E203内核优化方法

    对蜂鸟E203内核进行优化可以考虑以下几个方面: 编译器优化:使用适合蜂鸟E203的编译器选项和指令集,优化编译器的选项和参数,开启对硬件的特定支持,比如使用-O2等
    发表于 10-21 07:55

    研磨盘在哪些工艺中常用

    研磨盘在多种工艺中都是不可或缺的工具,主要用于实现工件表面的高精度加工和成形。以下是研磨盘常用的工艺领域及具体应用: ‌ 一、半导体制造工艺 ‌ ‌ 晶圆减薄与抛光 ‌ 用于硅、碳化硅等半导体晶圆
    的头像 发表于 07-12 10:13 765次阅读

    基于Matlab与FPGA的双边滤波算法实现

    前面发过中值、均值、高斯滤波的文章,这些只考虑了位置,并没有考虑相似度。那么双边滤波来了,既考虑了位置,有考虑了相似度,对边缘的保持比前几个好很多,当然实现上也是复杂很多。本文将从原理入手,采用Matlab与FPGA设计实现双边滤波算法。
    的头像 发表于 07-10 11:28 4081次阅读
    基于<b class='flag-5'>Matlab</b>与FPGA的双边滤波算法实现

    如何优化编程电源控制环路参数?

    优化编程电源控制环路参数是提升其动态响应、稳定性和输出精度的关键步骤,需结合理论分析、仿真验证、实验调整三阶段,并重点关注补偿网络设计、参数计算、仿真优化、实验验证等核心环节。以下是具体优化
    发表于 07-02 15:56

    芯片前端设计中常用的软件和工具

    前端设计是数字芯片开发的初步阶段,其核心目标是从功能规格出发,最终获得门级网表(Netlist)。这个过程主要包括:规格制定、架构设计、HDL编程、仿真验证、逻辑综合、时序分析和形式验证。
    的头像 发表于 05-15 16:48 1211次阅读

    MATLAB在工程中的应用

    电子发烧友网站提供《MATLAB在工程中的应用.pdf》资料免费下载
    发表于 04-19 16:54 8次下载

    电子电路设计中常用的接地方式详解

    在电子电路设计中,接地方式的选择至关重要,它直接影响到电路的稳定性、抗干扰能力和安全性。以下是电子电路设计中常用的几种接地方式的详解: 一、浮地 1. 定义:浮地是指电路或设备与公共地线可能引起环流
    的头像 发表于 04-17 16:24 1348次阅读
    电子电路设计<b class='flag-5'>中常用</b>的接地方式详解

    VirtualLab Fusion应用:非近轴衍射分束器的设计与优化

    )的结构设计生成一系列分束器的初始设计,然后通过傅里叶模态法或严格耦合波分析(FMM/RCWA)进一步优化。为了给最后一个优化步骤定义一个合适和有效的优化函数,应用了可编程光栅分析器。
    发表于 03-10 08:56

    如何优化 CPLD 性能

    CPLD(复杂可编程逻辑器件)是一种介于简单PLD(可编程逻辑器件)和FPGA(现场可编程门阵列)之间的可编程逻辑器件。它们通常用于实现中等
    的头像 发表于 01-23 10:03 1109次阅读

    DIY项目中常用的端子类型

    在DIY项目中,选择合适的端子类型对于确保电气连接的可靠性和安全性至关重要。以下是一些常用的端子类型,以及它们的特点和应用场景: 1. 针式端子(Pin Terminals) 特点 :针式端子通常用
    的头像 发表于 12-29 10:45 2300次阅读

    低压配电柜中常用的电表有哪些?

    一、 低压配电柜中常用的电表类型包括: 1. 电压表 电压表主要用于测量电压,广泛应用于电力系统中。在低压配电柜中,电压表被用于测量电源电压,其显示范围一般为0-1000V。电压表可以分为直流电
    的头像 发表于 12-25 10:50 3543次阅读
    低压配电柜<b class='flag-5'>中常用</b>的电表有哪些?

    MATLAB绘图合集

    MATLAB绘制各种图像绘制应有尽有。
    发表于 12-20 17:32 2次下载

    盘点环境电器中常用的传感器

    数字化处理和分析。本文将深入探讨环境电器中常用的传感器,包括二氧化碳传感器、甲醛传感器、粉尘传感器和温湿度传感器,并揭示它们在提升产品智能化水平和提供健康舒适居住环境方面的重要作用。 二氧化碳传感器 二氧化碳传
    的头像 发表于 12-20 09:21 1083次阅读

    求LabVIEW程序代做,关于噪声测量方面,需要matlab与labview混合编程,涉及优化算法、PID控制等,可带价联系

    求LabVIEW程序代做,关于噪声测量方面,需要matlab与labview混合编程,涉及优化算法、PID控制等,可带价联系QQ2789223947
    发表于 12-11 17:27