002_avoid_for_loop_in_Matlab避免使用for循环

news2024/9/30 11:38:58

避免使用for循环

在程序设计思想中,循环是一个很有力的工具。在循环中,计算机很轻松地重复执行相同的操作。循环是汇编之上的编程中最重要的概念之一。Matlab的循环有两个语言构造,一个是for循环,另一个是while循环。在Matlab中,for循环是最常用的循环结构。

然而,for循环在Matlab中是非常慢的。这是因为Matlab是一种解释性语言,而不是一种编译性语言。比如,立志于在科学计算领域开辟一“新”道路的Julia语言,其宣传的最重要特点之一就是for循环的速度非常快。

作为经常需要处理大量数据的科学计算工具,Matlab的for循环速度慢是一个很大的问题。因此,我们应该尽量避免使用for循环。

这里有一个说法可以特别地在这里提到,就是所谓的过早优化。过早优化是一种不好的编程习惯。在程序设计的初期,我们应该首先考虑代码的可读性和可维护性。然后,我们应该考虑代码的性能。然而在Matlab中,避免使用for循环并不意味着我们应该在一开始就考虑性能问题。通过采用下面我们提到的方式,编写的Matlab代码的可读性和可维护性也是非常强的。

1. For循环的基本知识

1.1 语法

在Matlab中,for循环的构造如下:

for i = 1:n
    % do something
end

这个构造同样也可以写成单行的形式:

for i = 1:n, statements, end

如果我们要对一个向量v进行操作,可以使用如下的for循环:

for i = 1:length(v)
    % do something
end

上面,1:n1:length(v)是for循环的索引。实际上,在Matlab中,:操作符会直接产生一个数组(Matlab最基本的数据结构),并且这个操作符还能够设定步长。比如,1:2:10会产生一个从1到10的数组,步长为2。

for语言构造采用 = 来迭代一个数组。所以,前一个例子里面,可以直接写成:

for vi = v
    % do something
end

1.2 break和continue

在For循环中,要避免改变索引变量的值来试图改变循环过程,for循环会直接覆盖对这个值的改变。这一点跟很多别的程序设计语言并不相同。

for i = 1:10
    i = 5; % 这个操作是无效的
    disp(i);
end

要中途退出一个循环,可以使用关键词break。要跳过当前循环的剩余部分,可以使用关键词continue。

运行一下上面的代码,会打印10个5。

1.3 循环二维数组

另外,我们都知道Matalb的2维数组(矩阵)是列先的,所以在for循环中,对矩阵的操作,应该是按列进行的。比如:

A = [1 2 3; 4 5 6; 7 8 9];
for Ai = A
    disp(Ai);
end

上面的代码会打印出矩阵A的每一列。

在这里插入图片描述

Q: 如果上面的A是一个列向量,会怎么样?循环几次?

A: 循环一次。因为列向量是一个列,所以循环一次。

Q: 如果A是一个行向量呢?

A: 行向量有多少个元素,就循环多少次。

这里还挺有意思的,Matlab的for循环是按列进行的,所以对于一个矩阵,我们可以使用for循环来对每一列进行操作。这是一个很有用的特性。而一维数组,列向量和行向量,是一个维数为1的矩阵,所以对于这些数据,for循环的行为是具有一致性的。

2. 避免使用for循环

2.1 算法矩阵化

Matlab是一种矩阵化的语言。这意味着,Matlab的很多操作都是对整个矩阵进行的。与C、Java等语言不同,Matlab的很多操作都是对整个矩阵进行的,Matlab提供了大量针对矩阵进行计算的操作符和操作函数。这些操作符和函数都是高度优化过的,所以在Matlab中,我们应该尽量使用矩阵化的操作。这一点应该是Matlab的使用者在设计算法之初就应该考虑的。

把算法的步骤推导为矩阵的形式,可以为Matlab来实现提供很大的帮助。比如,我们要计算一个向量的平方和,可以使用for循环:

v = [1 2 3 4 5];
sumv = 0;
for vi = v
    sumv = sumv + vi^2;
end

这里需要注意,如果v是列向量,那么只会循环一次,得到奇怪的结果。(可以自己试试,并思考为什么)

我们可以使用矩阵化的操作:

v = [1 2 3 4 5];
sumv = v * v';

这里用到了行矩阵x列矩阵的乘法。

A m × n × B n × p = C m × p A 1 × n × B n × 1 = c \begin{split} & A_{m \times n} \times B_{n \times p} = C_{m \times p} \\ & A_{1 \times n} \times B_{n \times 1} = c \end{split} Am×n×Bn×p=Cm×pA1×n×Bn×1=c

2.2 计算向量化

Matlab还提供了另外一个非常强大的工具,那就是向量化。向量化就是把操作符应用到一个矩阵的每一个元素上。比如,计算向量平方和,可以用向量化的方法写成:

v = [1 2 3 4 5];
sumv = sum(v.^2);

这里用到一个向量化操作的函数sum和一个向量化算符.^。前者是对矩阵的每一个元素求和,后者是对矩阵的每一个元素进行平方。

Matlab提供了大量的向量化操作符和函数,这些函数和操作符都是高度优化过的

3. 数组的逻辑索引与arrayfun函数

Matlab还提供了一些数组的逻辑操作,这些操作也是高度优化过的。比如,我们要找出一个向量中所有大于5的元素:

v = [1 2 3 4 5 6 7 8 9];
vgt5 = v(v > 5);

这里用到了一个逻辑操作符>,这个操作符会产生一个逻辑数组,然后我们可以用这个逻辑数组来索引原数组。

通过逻辑数组索引,还能够实现很多高级的操作。比如,我们要把一个向量中所有的偶数都变成0:

v = [1 2 3 4 5 6 7 8 9];
v(v % 2 == 0) = 0;

这里用到了一个逻辑操作符==,这个操作符会产生一个逻辑数组,然后我们可以用这个逻辑数组来索引原数组。

可以通过比较复杂的函数来产生逻辑数组,然后用逻辑数组来索引原数组。这样,我们就可以把很多循环操作转化为矩阵化的操作。特别是,用逻辑判断的函数加上arrayfun函数,可以实现很多循环操作。

v = [1 2 3 4 5 6 7 8 9];
predicate = @(x) x > 5 && x < 8;
index = arrayfun(predicate, v);
v(index) = 0;

通过这样的办法,可以写出非常易读的代码,并且也可能会更快。

4. 总结

在Matlab中,for循环是非常慢的。我们应该尽量避免使用for循环。Matlab提供了大量的矩阵化操作符和函数,向量化操作符和函数,逻辑操作符和函数,这些操作符和函数都是高度优化过的。我们应该尽量使用这些操作符和函数,来代替for循环。

  1. 使用矩阵化的操作,从设计和推导算法的时候就采用矩阵来表示;
  2. 使用向量化的操作,对矩阵的每一个元素进行操作;
  3. 使用逻辑索引操作矩阵的部分元素;
  4. 可以考虑使用arrayfun函数来代替for循环。

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

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

相关文章

Git原理及使用

1、Git初识 Git是一种版本控制器: 对于同一份文件,做多次改动,Git会记录每一次改动前后的文件。 通俗的讲就是⼀个可以记录⼯程的每⼀次改动和版本迭代的⼀个管理系统,同时也⽅便多⼈协同作业。 注意: Git其实只能跟踪⽂本⽂件的改动,⽐如TXT⽂件,⽹⻚,所有的程序代码…

基于docker配置pycharm开发环境

开发过程中&#xff0c;为了做好环境隔离&#xff0c;经常会采用docker来进行开发&#xff0c;但是如何快速将docker中的环境和本地开发的IDE链接起来是一个常见问题&#xff0c;下面对其进行简单的总结&#xff1a; &#xff08;1&#xff09;前期准备 开发环境docker和工具p…

【练习】双指针算法思想

&#x1f3a5; 个人主页&#xff1a;Dikz12&#x1f525;个人专栏&#xff1a;Java算法&#x1f4d5;格言&#xff1a;那些在暗处执拗生长的花&#xff0c;终有一日会馥郁传香欢迎大家&#x1f44d;点赞✍评论⭐收藏 目录 1. 移动零 1.1 题目描述 1.2 讲解算法原理 1.3 编…

STM32 AD单通道函数设计

单片机学习&#xff01; 目录 文章目录 前言 一、ADC配置步骤 二、详细步骤 2.1 开启RCC时钟 2.2 配置GPIO 2.3 配置多路开关 2.4 配置ADC转换器 2.5 开启ADC电源 2.6 ADC进行校准 2.6.1 复位校准 2.6.2 等待复位校准完成 2.6.3 开始校准 2.6.4 等待校准完成 三、启动AD转换函数…

数据结构大合集06——树与二叉树的相关函数运算算法

函数运算算法合集06 1、树的基本运算1.1 树的存储结构1.1.1 双亲存储结构1.1.2 孩子链存储结构1.1.3 孩子兄弟链式存储结构 2、二叉树的顺序存储2.1 二叉树顺序存储的结构体2.2 顺序存储的基本思路 3、二叉树的链式存储3.1 二叉树的链式存储的结构体3.2 链式存储的基本算法3.2.…

docker镜像复制与常见命令

一、前言 最近通过阿里的镜像仓库远程拉取镜像&#xff0c;发现以前的版本不见了&#xff0c;拉取了最新的镜像&#xff0c;有发现版本不配问题。那么想使用老版本的镜像那就要从别的环境获取。于是就需要进行离线镜像复制&#xff0c;打包&#xff0c;上传&#xff0c;重新导入…

时序预测 | Matlab实现BiTCN-GRU双向时间卷积神经网络结合门控循环单元时间序列预测

时序预测 | Matlab实现BiTCN-GRU双向时间卷积神经网络结合门控循环单元时间序列预测 目录 时序预测 | Matlab实现BiTCN-GRU双向时间卷积神经网络结合门控循环单元时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab实现BiTCN-GRU双向时间卷积神经网络结…

Tkinter 一文读懂

Tkinter 简介 Tkinter&#xff08;即 tk interface&#xff0c;简称“Tk”&#xff09;本质上是对 Tcl/Tk 软件包的 Python 接口封装&#xff0c;它是 Python 官方推荐的 GUI 工具包&#xff0c;属于 Python 自带的标准库模块&#xff0c;当您安装好 Python 后&#xff0c;就可…

AI新工具(20240322) 免费试用Gemini Pro 1.5;先进的AI软件工程师Devika;人形机器人Apptronik给你打果汁

✨ 1: Gemini Pro 1.5 免费试用Gemini Pro 1.5 Gemini 1.5 Pro是Gemini系列模型的最新版本&#xff0c;是一种计算高效的多模态混合专家&#xff08;MoE&#xff09;模型。它能够从数百万个上下文Token中提取和推理细粒度信息&#xff0c;包括多个长文档和数小时的视频、音频…

R语言逻辑回归与lasso模型

一、数据描述 数据集heart_learning.csv与heart_test.csv是关于心脏病的数据集&#xff0c;heart_learning.csv是训练数据集&#xff0c;heart_test.csv是测试数据集。 变量名称变量说明age年龄sex性别&#xff0c;取值1代表男性&#xff0c;0代表女性pain 胸痛的类型&#x…

SQLiteC/C++接口详细介绍sqlite3_stmt类(十二)

返回&#xff1a;SQLite—系列文章目录 上一篇&#xff1a;SQLiteC/C接口详细介绍sqlite3_stmt类&#xff08;十一&#xff09; 下一篇&#xff1a; SQLiteC/C接口详细介绍sqlite3_stmt类&#xff08;十三&#xff09; 48、sqlite3_stmt_isexplain sqlite3_stmt_is…

Django日志(四)

一、Filters介绍 过滤器用于从logger传递给handler的哪些日志要做额外控制 默认情况下,满足日志级别的任何消息都将处理。只要级别匹配,任何日志消息都会被处理。不过,也可以通过添加 filter 来给日志处理的过程增加额外条件。例如,可以添加一个 filter 只允许某个特定来源…

手机网页关键词视频爬虫采集软件可导出视频分享链接|视频无水印批量下载工具

全新音视频批量下载工具&#xff0c;为您解放视频管理烦恼&#xff01; 现如今&#xff0c;音上涌现出大量精彩的视频内容&#xff0c;但是要想高效地获取、管理和分享这些视频却是一件颇具挑战的事情。针对这一难题&#xff0c;我们自主研发了全新的音视频批量下载工具&#x…

什么是单点登录?

单点登录&#xff08;Single Sign On&#xff0c;简称 SSO&#xff09;简单来说就是用户只需在一处登录&#xff0c;不用在其他多系统环境下重复登录。用户的一次登录就能得到其他所有系统的信任。 为什么需要单点登录 单点登录在大型网站应用频繁&#xff0c;比如阿里旗下有淘…

B-tree - 深度解析+C语言实现+opencv绘图助解

B-tree - 深度解析C语言实现opencv绘图助解 1. 概述2. B-tree介绍3. Btree算法实现3.1 插入3.1.1 排序3.1.2 分裂1) 叶子节点的分裂2) 根节点的分裂&#xff08;特殊的分裂&#xff09;3) 内节点的分裂 3.2 删除3.2.1 再平衡&#xff08;Rebalance&#xff09;左旋右旋合并 3.2…

蓝桥杯 2022 省B 积木画

这是个典型的动态规划问题&#xff0c;重点在于找到他的递推方程。 可简单算出填满第0 1 2 3 4列个数为0 1 2 5 11&#xff1b; 运气好点&#xff0c;找到递推公式dp[i]2*dp[i-1]dp[i-3]; 直接解决了。 但我们还是按照动态规划一步一步来。 思路分析&#xff1a; 状态定义&a…

css3鼠标悬停图片特效,图片悬停效果源码

特效介绍 css3鼠标悬停图片特效,图片悬停效果源码&#xff0c;可以在网页上面作为自己的动态加载名片&#xff0c;放到侧边栏或者网站合适的位置即可 动态效果 代码下载 css3鼠标悬停图片特效,图片悬停效果源码

docker进阶篇,docker集群介绍

docker swarm 官网&#xff1a;https://docs.docker.com/engine/swarm/how-swarm-mode-works/nodes/ 什么是 docker swarm docker swarm 是 docker 官方提供的容器编排和集群管理工具。它允许用户将多个 docker 主机组成一个虚拟的 docker 集群&#xff0c;以便更高效地管理…

解决用POI库生成的word文件中的表格在python-docx无法解析的问题

问题背景 用apache-poi生成word文件中表格&#xff0c;在使用python-docx库解析时报错&#xff1a; 问题分析 1. word文档本质上是一个rar压缩包&#xff0c;用winrar解析后如下&#xff1a; 2. 查看document.xml&#xff0c;可以看到table元素下面是没有<w:tblGrid>这…

HTTP --- 上

目录 1. HTTP协议 2. 认识URL 2.1. URL中的四个主要字段 2.2. URL Encode && URL Decode 3. HTTP 协议格式 3.1. 快速构建 HTTP 请求和响应的报文格式 3.1.1. HTTP 请求格式 3.1.2. HTTP 响应格式 3.1.3. 关于 HTTP 请求 && 响应的宏观理解 3.2. 实现…