012_control_flow_in_Matlab中的控制流

Matlab中的控制流

虽然,我们说Matlab中的计算是向量化的,但是在某些情况下,作为一个“程序设计语言”,Matlab也提供了一些控制流结构,来帮助我们实现一些复杂的逻辑。

我会在介绍控制流的时候,提醒如何用向量化的方式来实现相同的功能。

首先是一个总结的表格:

控制流说明
if, elseif, else根据条件是否为true执行相应语句
switch, case, otherwise从一组语句中选择性执行
for循环执行一定的次数
while当条件为真时一直执行
try, catch执行语句并捕捉异常
break中断forwhile循环
return中断脚本和函数的执行
continue跳过forwhile循环的剩下部分,并进入下一个循环的执行
pause暂时停止Matlab的运行
parfor并行版本的for循环
end终止代码块,或者表示最后一个索引

1. 条件语句

Matlab中的条件语句有ifelseelseifend

if condition1% do something
elseif condition2% do something
else% do something
end

这是一个完整的条件语句的结构,elseifelse是可选的。按照程序设计中尽快返回的原则,我们总是会把能够马上结束逻辑的条件放在前面。

此外还有一个多分支的条件语句switch

switch expressioncase condition1% do somethingcase condition2% do somethingotherwise% do something
end

switch语句中,caseotherwise是可选的。switch语句的执行逻辑是,从上到下,遇到第一个满足条件的case,就执行对应的逻辑,然后跳出switch语句。如果没有满足条件的case,就执行otherwise的逻辑。

对于数字,测试case_expression == switch_expression。
对于字符向量,测试strcmp(case_expression,switch_expression) == 1。
对于支持eq函数的对象,case_expression == switch_expression。重载的eq函数的输出必须是逻辑值或者可以转换为逻辑值。
对于一个元胞数组case_expression,至少有一个元素与switch_expression匹配,这里的元素可以是数字、字符向量和对象。

2. 循环语句

Matlab有几种方式实现循环,forwhile

2.1 for循环

for循环的结构如下:

for i = 1:10% do something
end

这是一个从1到10的循环,i是循环变量,可以在循环体内使用。

2.2 while循环

while循环的结构如下:

i = 1;
while i <= 10% do somethingi = i + 1;
end

在循环中,可以采用breakcontinue来控制循环的执行。这跟其它的编程语言是一样的。

3. 向量化循环条件语句

在Matlab中,我们可以用逻辑索引来实现循环+条件。我们很随意地指定一个例子,就是随机N个数,然后统计大于0.5的数的个数。这个结果不用看,肯定会在N趋向于无穷大时收敛到0.5*N。

第一个版本,采用for循环和if条件语句:

function count = forIf(N)a = rand(1,N);
count = 0;
for ai = aif ai > 0.5count = count + 1;end
end

第二个版本,只有一行代码,采用逻辑索引和sum函数:

function count = logicalIndex(N)
a = rand(1,N);
count = sum(a>0.5);

这里的内存复杂度很容易看出来,forIf的内存复杂度是O(1),而logicalIndex的内存复杂度是O(N)。后者产生了一个零时的逻辑索引数组,然后再计算逻辑索引的和。

下面来看看时间复杂度。

t1 = @(n) timeit(@() forIf(n));
t2 = @(n) timeit(@() logicalIndex(n));n = round(logspace(3, 8, 10));t1s = arrayfun(t1, n);
t2s = arrayfun(t2, n);plot(n, t1s, 'r', n, t2s, 'g');legend({'For loop', 'Logical Index'});
xlabel('n');
ylabel('Time with timeit');
print -dpng -r600 comparefigure
semilogx(n, t1s ./ t2s, 'h', 'linewidth', 2)
xlabel('n');
ylabel('Acceleration');
print -dpng -r600 ar

在这里插入图片描述

很容易看出,两个算法的时间复杂都是O(N),但是logicalIndex的速度要快很多,具体来说就是快2到3倍。

在这里插入图片描述

4. 结论

大概来看,Matlab中的控制流结构和其它编程语言是一样的。

但是在Matlab中,我们可以用向量化的方式来实现循环和条件语句,这样可以提高代码的可读性和运行速度。

可以看到,要获得更好的时间性能,必然会牺牲空间性能,这是一个典型的时间空间权衡问题。对于某些要按照时间步长计算的问题,要得到更快的计算速度,我们也会把所有时间不长的数组空间都事先申请,并写成矩阵计算的方式来实现,从而提高计算速度。

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

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

相关文章

Ansys Zemax | 如何将光栅数据从Lumerical导入至OpticStudio(上)

附件下载 联系工作人员获取附件 本文介绍了一种使用Ansys Zemax OpticStudio和Lumerical RCWA在整个光学系统中精确仿真1D/2D光栅的静态工作流程。将首先简要介绍方法。然后解释有关如何建立系统的详细信息。 本篇内容将分为上下两部分&#xff0c;上部将首先简要介绍方法工…

【Leetcode】top 100 技巧

136 只出现一次的数字 给你一个 非空 整数数组 nums &#xff0c;除了某个元素只出现一次以外&#xff0c;其余每个元素均出现两次。找出那个只出现了一次的元素。你必须设计并实现线性时间复杂度的算法来解决此问题&#xff0c;且该算法只使用常量额外空间。 技巧&#xff1a…

LeetCode 96. 不同的二叉搜索树

给你一个整数 n &#xff0c;求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种&#xff1f;返回满足题意的二叉搜索树的种数。 示例 1&#xff1a; 输入&#xff1a;n 3 输出&#xff1a;5示例 2&#xff1a; 输入&#xff1a;n 1 输出&#xff1a;1提…

代码随想录算法训练营第二十二天| 235.二叉搜索树的最近公共祖先、701.二叉搜索树中的插入操作、450.删除二叉搜索树中的节点

系列文章目录 目录 系列文章目录235. 二叉搜索树的最近公共祖先①递归法自己写的简洁版 ②迭代法不能这样写&#xff01;正确写法 701.二叉搜索树中的插入操作①递归法②迭代法 450.删除二叉搜索树中的节点递归法 235. 二叉搜索树的最近公共祖先 ①递归法 自己写的 class So…

书生·浦语大模型InternLM-Chat-1.8B 智能对话 Demo 第二期

文章目录 InternLM-Chat-1.8B 智能对话 Demo环境准备下载模型运行 InternLM-Chat-1.8B web 运行八戒 demo下载模型执行Demo InternLM-Chat-1.8B 智能对话 Demo 环境准备 在InternStudio平台中选择 10% A100(1/4) 的配置&#xff08;平台资源有限&#xff09;&#xff0c;如下图…

【c语言】自定义类型:联合体(公用体)【详解】

联合体 联合体类型的声明 像结构体⼀样&#xff0c;联合体也是由⼀个或者多个成员构成&#xff0c;这些成员可以不同的类型。但是编译器只为最⼤的成员分配⾜够的内存空间。联合体的特点是所有成员共⽤同⼀块内存空间。所以联合体也叫&#xff1a;共用体。 给联合体其中⼀个成…

2024阿里云域名优惠口令免费领取,COM、CN和xin域名口令

2024年阿里云域名优惠口令&#xff0c;com域名续费优惠口令“com批量注册更享优惠”&#xff0c;cn域名续费优惠口令“cn注册多个价格更优”&#xff0c;cn域名注册优惠口令“互联网上的中国标识”&#xff0c;阿里云优惠口令是域名专属的优惠码&#xff0c;可用于域名注册、续…

【QT入门】 自定义标题栏界面qss美化+按钮功能实现

往期回顾&#xff1a; 【QT入门】 鼠标按下和移动事件实现无边框窗口拖动-CSDN博客【QT入门】 设计实现无边框窗口拉伸的公用类-CSDN博客【QT入门】对无边框窗口自定义标题栏并实现拖动和拉伸效果-CSDN博客 【QT入门】 自定义标题栏界面qss美化按钮功能实现 一、最终效果 二、…

【JAVASE】学习类与对象的创建和实例化

✅作者简介&#xff1a;大家好&#xff0c;我是橘橙黄又青&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;再无B&#xff5e;U&#xff5e;G-CSDN博客 目标&#xff1a; 1. 掌握类的定义方式以及对象的实例化 2. …

MVCC的实现原理

简介 MVCC&#xff08;Multi-Version Concurrency Control&#xff09;即多版本并发控制。 MVCC的实现原理 我们在了解MVCC之前&#xff0c;首先先了解一下几个比较常见的锁。 **读锁&#xff1a;**也叫共享锁、S锁&#xff0c;若事务T对数据对象A加上S锁&#xff0c;则事务…

一维卷积神经网络的特征可视化

随着以深度学习为代表的人工智能技术的不断发展&#xff0c;许多具有重要意义的深度学习模型和算法被开发出来&#xff0c;应用于计算机视觉、自然语言处理、语音处理、生物医疗、金融应用等众多行业领域。深度学习先进的数据挖掘、训练和分析能力来源于深度神经网络的海量模型…

使用OpenCV4.9的随机生成器和文本

返回&#xff1a;OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 上一篇&#xff1a;OpenCV 4.9基本绘图 下一篇&#xff1a;OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 目标 在本教程中&#xff0c;您将学习如何&#xff1a; 使用随机数生…

软件架构风格_2.调用/返回体系结构风格

调用/返回风格是指在系统中采用了调用与返回机制。利用调用-返回实际上是一种分而治之的策略&#xff0c;其主要思想是将一个复杂的大系统分解为若干子系统&#xff0c;以便降低复杂度&#xff0c;并且增加可修改性。程序从其执行起点开始执行该构件的代码&#xff0c;程序执行…

分发饼干(力扣455)

文章目录 题目贪心算法思想概述关键要素解题步骤优缺点优点缺点 应用领域 题解一、思路二、解题方法三、Code 总结 题目 Problem: 455. 分发饼干 假设你是一位很棒的家长&#xff0c;想要给你的孩子们一些小饼干。但是&#xff0c;每个孩子最多只能给一块饼干。对每个孩子 i&am…

2024 ccfcsp认证打卡 2023 05 01 重复局面

2023 05 01 重复局面 题目题解1题解2区别&#xff1a;数据存储方式&#xff1a;时间复杂度&#xff1a;空间复杂度&#xff1a; 总结&#xff1a; 题目 题解1 import java.util.*;public class Main {public static void main(String[] args) {Scanner input new Scanner(Sys…

Stream 流和 Lambda 组装复杂父子树形结构

在最近的开发中&#xff0c;遇到了两个类似的需求&#xff1a;都是基于 Stream 的父子树形结构操作&#xff0c;返回 List 集合对象给前端。于是在经过需求分析和探索实践后有了新的认识&#xff0c;现在拿出来和大家作分享交流。 一般来说完成这样的需求大多数人会想到递归&a…

面试题 之 vue

1.vue里怎样实现双向数据绑定&#xff1f; Viewmodel 中的Domlisteners 工具会帮我们检测页面上Dom元素的变化&#xff0c;如果有变化&#xff0c;则更改Model中的数据&#xff0c;更新model中的数据时&#xff0c;数据事件绑定工具会帮我们更新页面中的Dom元素 2.Vue的响应式原…

3d代理模型怎么转换成标准模型---模大狮模型网

在当今的虚拟世界中&#xff0c;3D建模技术被广泛运用于游戏开发、电影制作、工业设计等领域。在3D建模过程中&#xff0c;有时会遇到需要将代理模型转换成标准模型的情况。模大狮将从理论和实践两方面&#xff0c;介绍如何将3D代理模型转换成标准模型&#xff0c;以帮助读者更…

【MySQL】事务是什么?事务的特性又是什么?

文章目录 ✍事务是什么&#xff1f;✍事务的特性&#xff08;四个&#xff09;✍事务并发时出现的问题✍事务的隔离性 ✍事务是什么&#xff1f; 事务是由一个或多个SQL语句构成的&#xff0c;在事务中&#xff0c;这些的SQL不可分割&#xff0c;是一个整体&#xff0c;整个事…

C++万物起源:类与对象(三)拷贝构造、赋值重载

目录 一、拷贝构造函数 1.1拷贝构造函数的概念与特征 1.2拷贝构造的实现 1.3默认构造函数 1.4拷贝构造函数典型调用场景 二、赋值运算符重载 2.1赋值运算符重载的格式 一、拷贝构造函数 1.1拷贝构造函数的概念与特征 在c语言语法中&#xff0c;我们可以将一个变量赋值给…