012_control_flow_in_Matlab中的控制流

news2024/11/23 18:42:59

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 expression
    case condition1
        % do something
    case condition2
        % do something
    otherwise
        % 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 something
    i = 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 = a
    if ai > 0.5
        count = 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 compare

figure
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.coloradmin.cn/o/1558214.html

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

相关文章

Spark源码(二)-Netty简介

一、Netty简介 Netty 是一个异步事件驱动的网络通信应用框架&#xff0c;用于快速开发可维护的高性能服务器和客户端。简单地说Netty封装了JDK的NIO&#xff0c;不用再写一大堆复杂的代码&#xff0c;从NIO各种繁复的细节中脱离出来&#xff0c;让开发者重点关心业务逻辑。 二…

新书速递——《可解释AI实战(PyTorch版)》

本书旨在帮助你实施最新的可解释AI技术&#xff0c;以构建公平且可解释的AI系统。可解释AI是当今AI研究中的热门话题&#xff0c;但只有少数资源和指南涵盖了所有重要技术&#xff0c;这些技术对实践者来说非常有价值。本书旨在填补这一空白。 本书读者对象 本书既适合那些有兴…

阿里云2核4G云服务器支持多少人同时在线?并发数计算?

阿里云2核4G服务器多少钱一年&#xff1f;2核4G配置1个月多少钱&#xff1f;2核4G服务器30元3个月、轻量应用服务器2核4G4M带宽165元一年、企业用户2核4G5M带宽199元一年。可以在阿里云CLUB中心查看 aliyun.club 当前最新2核4G服务器精准报价、优惠券和活动信息。 阿里云官方2…

04 | Swoole 源码分析之 epoll 多路复用模块

首发原文链接&#xff1a;Swoole 源码分析之 epoll 多路复用模块 大家好&#xff0c;我是码农先森。 引言 在传统的IO模型中&#xff0c;每个IO操作都需要创建一个单独的线程或进程来处理&#xff0c;这样的操作会导致系统资源的大量消耗和管理开销。 而IO多路复用技术通过…

第十四届蓝桥杯JavaA组省赛真题 - 棋盘

解题思路&#xff1a; 暴力 棋盘类题目取反操作&#xff1a; f[a][b]^1; 或者f[a][b] 1 - f[a][b]; import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scan new Scanner(System.in);int n scan.nextInt();int m scan.nex…

(南京观海微电子)——GOA介绍

GOA是Gate on Array的简写&#xff0c;简单可以理解为gate IC集成在玻璃上了&#xff0c;面板就可以不用gate ic了&#xff0c;是一种低成本的设计&#xff0c;窄边框面板大多数都用了GOA技术。还有一些公司叫GIP&#xff08;Gate in Panel&#xff09;&#xff0c;GDM等等。 …

已上线项目,突然有一天网站虽进得去,但是接口拿不到数据,作为前端的你如何排查问题?

在开始写这篇博客之前,想说几句题外话哈,虽然自己的粉丝不多,但自己每篇博客都是用心在写,可能后面会针对部分文章开启只有VIP才能访问,原因你们也懂得(▽),无非是想赚点外块呗,不过主要现在也是知识付费时代,毕竟自己写出的东西也是本人亲身经历着,也是具有一定的价值…

针对pycharm打开新项目需要重新下载tensorflow的问题解决

目录 一、前提 二、原因 三、解决办法 一、前提 下载包之前&#xff0c;已经打开了&#xff0c;某个项目。 比如&#xff1a;我先打开了下面这个项目&#xff1a; 然后在terminal使用pip命令下载&#xff1a; 如果是这种情况&#xff0c;你下载的这个包一般都只能用在这一个…

【已解决】centos执行Hangfire任务时间隔八个小时

参数说明&#xff1a; centos系统是7.9版本的 hangfire是Hangfire 1.8.7 centos系统的目前设置时区是cts的东八时区&#xff0c;截图如下 原因&#xff1a; hangfire任务设定每天执行时间东八实际偏移的执行时间 比如&#xff1a;你设定的是早上6点执行东八实际下午两点执行 …

【web自动化】selenium的使用(二)

目录 复选框操作多层框架操作下拉框操作弹窗操作 复选框操作 示例&#xff1a;批量操作对象&#xff0c;比如将页面上所有的checkbox 都勾上 方法&#xff1a;先用标签选择器选择页面上所有的input&#xff0c;然后从中过滤出属性type是checkbox的 并勾选 List<WebElemen…

Debian linux版本下运行的openmediavault网盘 千兆网卡升级万兆

一、适用场景 1、使用vmware ESXi虚拟化平台运行多种不同应用服务器时&#xff0c;其中网盘服务器采用开源的openmediavault搭建&#xff1b; 2、将老专业服务器升级千兆网为万兆网&#xff1b; 3、需要转移的数据量大的企业或用户&#xff1b; 4、从服务器到服务器的数据转移…

Mac上的Gatekeeper系统跟运行时保护

文章目录 问题&#xff1a;无法打开“xxx.xxx”&#xff0c;因为无法验证开发者。macOS无法验证此App是否包含恶意软件。如何解决&#xff1f; 参考资料门禁运行时保护 问题&#xff1a;无法打开“xxx.xxx”&#xff0c;因为无法验证开发者。macOS无法验证此App是否包含恶意软件…

vue3+vite模版框架 tabs右键刷新时丢失路由参数

问题&#xff1a; 标题栏的tabs的右键&#xff1a;刷新时&#xff0c;没有保存上一个页面传递过来的参数 分析&#xff1a; TagView.vue刷新事件 function refreshSelectedTag(view: TagView) {console.log(|--执行刷新, view)tagsViewStore.delCachedView(view);const {full…

IDEA的使用(概念,安装,配置,)以及什么是字符集,模版

目录 Intellij IDEA IDE的概念 IntelliJ IDEA的安装 IntelliJ IDEA的使用 基本配置 JDK配置 创建Module 基本用法 字体配置 主题配置 字符集 设置IDEA默认字符集 注释模板 字符集 字符集简介 常见字符集 Intellij IDEA 我们不可能一直使用记事本之类变成&#…

Win7共享文件夹无法访问怎么办,win7共享文件夹访问不了

在win7系统中,用户可以通过局域网建立共享,然后将一些文件夹进行共享,方便用户访问。“共享文件”一般常用于办公室,某位同事的计算机用来和其它计算机间相互分享的文件夹。然而有时候需要访问共享文件时,却出现无法访问的情况,要怎么解决这样的问题呢?接下来,小编带来…

3D转换1111

1.三维坐标系 1.3D位移: translate3d(x,y,z)  translform:translateX(100px)&#xff1a;仅仅是在x轴上移动  translform:translateY(100px)&#xff1a;仅仅是在Y轴上移动  translform:translateZ(100px)&#xff1a;仅仅是在Z轴上移动&#xff08;注意&#xff1…

linux yum install jdk如何查找安装目录并配置环境变量

Linux服务已安装jdk1.8&#xff0c;此时需要在该服务器部署的应用要求依赖openJDK11&#xff0c;可按照以下命令进行安装openJDK11。 搜索查看安装包&#xff1a;yum search java-11-openjdk 如果能查找到安装包&#xff0c;执行以下安装命令进行安装。 安装openjdk11&#x…

互联网、因特网、万维网的区别

互联网 internet&#xff1a;凡是能彼此通信的设备组成的网络就叫互联网&#xff0c;即使只有两台计算机&#xff0c;无论以何种技术使其彼此通信&#xff0c;都叫互联网。所以&#xff0c;根据互联网的覆盖规模可以分为&#xff1a; 局域网&#xff08;Local Area Network&am…

Java接口实战:模拟咖啡制作、订购与消费完整流程(day14)

定义接口&#xff1a; // 咖啡制作接口 interface CoffeeMaker { Coffee makeCoffee(String type); } // 咖啡店接口 interface CoffeeShop { void orderCoffee(String type, CoffeeConsumer consumer); } // 咖啡消费者接口 interface CoffeeConsumer { void …

预处理详解(一) -- 预定义符号与#define定义

目录 一. 预定义符号二. #define1.#define定义常量2.#define定义宏3.带有副作用的宏参数4.宏替换的规则5.宏和函数的对比 一. 预定义符号 %s _ _FILE_ _ //文件 %s _ _ DATE_ _ //日期 %s _ _ TIME_ _ //时间 %d _ _ LINE_ _ //行号 %d _ _ STDC_ _ //如果编译器支持 ANSI C,那…