相见恨晚的Matlab编程小技巧(3)-程序运行太慢了咋解决——合理使用循环语句(1)

news2024/11/27 10:22:25

        相信大家在使用matlab时候经常会收到程序运行太慢的困扰,当程序比较复杂时,常常需要很长时间等待。我有个朋友就是这样,每次debug都要很长时间,等着的时候就想耍会手机,结果耍完一抬头发现程序运行结束了,但时间已经过去半天了。

        一般来说,程序运行太慢都是因为循环的存在,使用双层甚至多层循环会使得程序运行效率极低。这篇博客将重点介绍如何在Matlab中避免使用循环语句并提高程序效率。我们将深入讨论向量化运算、预分配空间和相关函数(cellfun、arrayfun和structfun等)的用法,同时配有详细的示例代码和解释,帮助大家更好地掌握这些技术和优化方法。

1.记录程序运行时间

        为了比较使用循环语句与否对程序运行时间的影响,我们需要用到matlab中的tic,toc语句,tic函数表示开始计时。执行tic语句后,程序就会记录下当前时间。接下来的代码运行时,而程序会在toc函数调用时输出自tic函数到当前时刻所经过的时间。例如:

tic    % 开始计时
% 模块代码
x = 1:10000000;
y = sin(x);
disp(y(1:10));
toc    % 打印出程序自tic调用以来经过的时间

        运行结果:

         如果你不想在命令行输出运行时间,也可以将程序运行时间存在变量中,避免在命令行输出,例如:

tic    % 开始计时
% 模块代码
x = 1:10^8;
y = sin(x);
time0=toc;    % 将程序自tic调用以来经过的时间存在变量time0中

2.向量化运算

        为了提高程序性能,我们可以使用向量化运算来避免循环,同时实现对向量中所有元素的操作。向量化运算是一种在Matlab中广泛使用的高效操作方式,它可以对整个向量或矩阵进行运算,而不需要使用循环。具体来说,向量化运算使用内部优化的编译器,通过单个指令完成多个元素的处理,因此能够大大提高程序的效率。在Matlab中,常用的向量化运算符包括 .*, ./, .^, .', .*,等。具体的用法如表1所示:

表1 向量化运算符号的用法

运算符用法说明
.*A .* BA 数组和 B 数组中对应元素逐个相乘
./A ./ BA 数组和 B 数组中对应元素逐个相除
.^A .^ BA 数组和 B 数组中对应元素逐个做幂运算
.*A .* BB 对应 A 的每一列进行元素相乘运算

        首先举一个简单的例子来介绍如何使用向量化运算来代替循环语句。假设有两个矩阵 x 和 y,都包含500×500×500个元素,现在你想将它们每个元素相乘,然后将乘积相加。如果如果使用循环语句,可以这样写代码:

tic
x=rand(500,500,500);
y=rand(500,500,500);
c = 0;
for k = 1:500
    for kk = 1:500
        for kkk = 1:500
            c = c + x(k,kk,kkk) * y(k,kk,kkk);
        end
    end
end
toc

        运行时间需要11.25秒。

        如果你使用向量化操作,代码会更加简单,运行时间也会更短:

tic
x=rand(500,500,500);
y=rand(500,500,500);
c = sum(x(:) .* y(:));
toc

         运行只要2.46秒,快了不止一点点,在这个例子中,x(:)和y(:)表示将矩阵x用一维向量的形式表示。x(:) .* y(:)表示将一维向量化之后的 x 和 y 中对应元素相乘,并得到一个新的向量化,然后使用 sum 函数对这个新向量求和,从而得到我们想要的结果。显然,使用向量操作代替循环,代码更简洁、更易读、更易扩展。当处理大型数据集时,向量操作也可以大大提高程序运行速度。

3.预分配空间

        大家在使用Matlab编程时应该都看到过类似这样的警告:

        这是在Matlab中,如果你想把一个新的元素添加到数组中,并且数组的大小没有指定或无法确定时,Matlab会重新分配整个数组并复制现有元素,这个过程会导致程序效率下降。当我们不得不使用循环语句时,我们也需要在使用变量前预分配空间。如果我们想在循环中构建一个数组时,你可以在循环之前预先分配数组空间,然后在循环中直接修改数组元素。这样做可以大大减少程序的运行时间和内存消耗。例如:

tic
x=rand(2000,2000);
y=rand(2000,2000);
for k = 1:2000
    for kk = 1:2000
        c(k,kk) = x(k,kk) * y(k,kk);
    end
end
toc

         上面的代码没有预分配内存,所需运行时间为4.45秒。如果在for循环之前初始化变量c,代码这样写:

tic
x=rand(2000,2000);
y=rand(2000,2000);
c=zeros(2000,2000);
for k = 1:2000
    for kk = 1:2000
        c(k,kk) = x(k,kk) * y(k,kk);
    end
end
toc

         运行时间变成了0.2秒。一个不起眼的变量初始化,可以让代码运行速率快这么多。所以,之后编程的过程中,只要遇到循环语句,一定要确保循环内部用到的变量都是预分配内存的。

        这篇博客就先介绍这两种比较常用的方法,还有另一种使用相关函数的方法,我们将在下一篇博客单独进行介绍。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/538106.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

利用废旧手机搭建一台属于自己的服务器

1. Termux —— 手机终端模拟器App 1.1 使用F-Droid应用商店安装Termux # F-Droid 下载地址:https://f-droid.org/packages/com.termux/ 1.2 使用Termux安装环境 在手机上打卡Termux软件(操作很不方便),后面介绍使用ssh服务通过…

基于ARIMA-LSTM组合模型的预测方法研究(Python代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

Vector - CAPL - CANoe DBC消息相关自动化_02

目录 GetMessageID -- 获取报文ID​编辑 代码示例 GetMessageName -- 获取报文名称 代码示例 getNextCANdbFilename -- 获取指定位置数据库文件命名 代码示例 getNextCANdbName -- 获取指定数据库的名称 代码示例 setSignalStartValues -- 设置目标信号初始值 代码示例…

计算机网络知识点大全

文章目录 1 计算机网络概述1.1.1 概念、组成、功能和分类1.1.2 标准化工作及相关组织1.1.3 速率相关的性能指标1.1.4 时延、时延带宽积、往返时间RTT、利用率1.2.1 分层结构、接口、协议、服务1.2.2 OSI参考模型1.2.4 TCP/IP与五层参考模型 第一章知识大纲2.物理层2.1 物理层基…

Docker实用篇

文章目录 Docker实用篇0.学习目标1.初识Docker1.1.什么是Docker1.1.1.应用部署的环境问题1.1.2.Docker解决依赖兼容问题1.1.3.Docker解决操作系统环境差异1.1.4.小结 1.2.Docker和虚拟机的区别1.3.Docker架构1.3.1.镜像和容器1.3.2.DockerHub1.3.3.Docker架构1.3.4.小结 1.4.安…

vue3的push问题

今天在处理动态数据时,使用push方法像数组中添加数据,会导致数组中所有参数都发生变化,解决方法可以搜到很多,这里使用的是如下的方法: 需要注意的是, 在push的时候需要newVal_value才能获取到深拷贝的值

常见的两种通信方式

引言 随着后端服务的发展,业务难度增加;单体的后端服务逐渐满足不了快速迭代,敏捷开发的节奏,在这样的背景下,分布式系统架构思想逐渐发展,并流行起来;在微服务思想下,将原有复杂的…

【c语言】文件的基本操作

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; &#x1f525;c语言系列专栏&#xff1a;c语言之路重点知识整合 &#x…

说说谷歌Chrome浏览器无痕浏览器窗口

当您启用无痕浏览后&#xff0c;设备的其他用户将不会看到您的历史记录。 Chrome 不会保存您的浏览记录或您在表单中填写的信息。当您浏览时&#xff0c;Chrome 会记住相应的 Cookie 和网站数据&#xff0c;但当您退出无痕模式时&#xff0c;Chrome 会删除这些数据。您可在打开…

qkeras量化模型-直接搭建模型的量化感知训练

量化框架qkeras: qkeras是谷歌的感知训练量化框架&#xff0c;具有一些功能&#xff1a; 1、支持导入keras模型到qkeras模型&#xff1b; 2、支持剪枝和量化&#xff0c;使用tensorflow lite一起配合&#xff0c;简直不要太好用&#xff1b; 3、支持指定量化函数&#xff0…

如何将百度等其他网页设置为谷歌浏览器的首页

原因&#xff1a; 谷歌浏览器默认是https://chrome.google.com/以该网址访问的 如果您想将百度网页设置为谷歌浏览器的首页&#xff0c;可以按照以下步骤进行操作&#xff1a; [ 1 ] 打开您的谷歌浏览器&#xff0c;点击右上角的“三个点”按钮&#xff0c;选择“设置”选项。[…

基于SpringBoot的财务管理系统的设计与实现

背景 财务管理系统能够通过互联网得到广泛的、全面的宣传&#xff0c;让尽可能多的员工了解和熟知财务管理系统的便捷高效&#xff0c;为管理者和员工提供了服务&#xff0c;节省人力、物力和时间&#xff0c;提高工作效率。 系统设计 为了更好的去理清本系统整体思路&#…

深度学习用于医学预后-第二课第四周1-4节-使用线性和基于树的模型构建风险评估模型

今天起进入到第四周课程的学习&#xff0c;使用线性和基于树的模型构建风险评估模型 风险分数 本周&#xff0c;你将学习建立和评估生存预测模型的策略&#xff0c;这些模型将使你能够比较个体患者的风险。您将学习两个这样的模型:Cox比例风险和生存树。最后&#xff0c;您将…

【学习心得】VMware的下载安装与创建Ubuntu虚拟机

Python在Linux系统中的开发环境搭建① 1、VMware的下载安装 1.1 去官方网站下载软件&#xff1a;https://www.vmware.com/ 1.2 在工具中找到workstation pro 1.3 点击试用版本 1.4 点击下载 1.5 双击安装 1.6 下一步 1.7 接受许可 1.8 选择足够空间的磁盘进行安装、勾选增强…

chatgpt赋能Python-pycharm中如何设置滚动条

PyCharm中如何设置滚动条 介绍 PyCharm是一款由JetBrains开发的Python集成开发环境&#xff0c;提供了丰富的功能和工具&#xff0c;让Python开发更加高效和方便。其中一个重要的功能就是滚动条&#xff0c;它可以帮助我们在长篇代码中快速找到需要的部分&#xff0c;并浏览整…

Chrome浏览器更新失败的问题(chrome无法更新至最新版本怎么办)

报错1 如果在计算机上更新 Chrome 时遇到问题&#xff0c;您可能会看到以下错误消息&#xff1a; 更新失败&#xff1a;管理员已停用更新更新失败&#xff08;错误&#xff1a;3 或 11&#xff09;&#xff1a;检查更新时出错&#xff0c;无法访问更新服务器更新失败&#xf…

网络安全学习路线

01 什么是网络安全 网络安全可以基于攻击和防御视角来分类&#xff0c;我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0c;而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 无论网络、Web、移动、桌面、云等哪个领域&#xff0c;都有攻与防两面…

chatgpt赋能Python-pycharm关联py文件

PyCharm关联Python文件的使用指南 PyCharm作为一款强大的Python开发工具&#xff0c;其集成的许多功能可以大大提高开发效率。其中之一就是PyCharm可以自动关联Python文件&#xff0c;让用户更加方便的进行Python程序的编写。本文将详细介绍PyCharm关联Python文件的使用方法及…

chatgpt赋能Python-pycharm快捷键

PyCharm快捷键大全&#xff1a;提高Python编程效率的秘密武器 在Python开发的过程中&#xff0c;PyCharm是被广泛使用的IDE之一。它可以帮助我们提高效率&#xff0c;省去不少重复性的工作&#xff0c;同时还具有强大的代码自动完成和调试功能。而在PyCharm中&#xff0c;有许…