news 2026/7/31 2:47:37

MATLAB流程控制语句:if判断、for循环与异常处理

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
MATLAB流程控制语句:if判断、for循环与异常处理

任何编程语言都需要流程控制,MATLAB也不例外。但MATLAB里有一个很重要的原则:能用矩阵运算就不用循环,循环在MATLAB里相对慢。这篇文章讲清楚各种控制结构的语法和适用场景。

if-elseif-else 条件判断

基本语法:

score=82;ifscore>=90grade='A';elseifscore>=80grade='B';elseifscore>=60grade='C';elsegrade='F';end

多条件组合:

x=15;y=-3;% && 和 || 是短路运算符,用于标量ifx>0&&y<0disp('x正y负')end% & 和 | 是逐元素运算符,用于数组v=[1,-2,3,-4];v(v>0&v<5)% 取1到5之间的元素

字符串条件判断:

method='spline';ifstrcmp(method,'linear')disp('线性插值')elseifstrcmp(method,'spline')disp('样条插值')end% R2017a之后可以直接比较string类型ifmethod=="spline"disp('样条插值')end

switch-case

枚举类型的多分支判断,比写一堆 if-elseif 清晰:

signal_type='sine';switchsignal_typecase'sine't=0:0.01:1;x=sin(2*pi*5*t);case{'square','rect'}% 多值用cell合并t=0:0.01:1;x=square(2*pi*5*t);case'sawtooth't=0:0.01:1;x=sawtooth(2*pi*5*t);otherwiseerror('不支持的信号类型:%s',signal_type)end

switch 也可以匹配数值:

n=3;switchncase1disp('一')case{2,3}disp('二或三')otherwisedisp('其他')end

for 循环

基础用法:

% 遍历数值范围fori=1:5fprintf('i = %d\n',i)end% 自定义步长fork=0:0.2:1disp(k)end% 倒序fori=10:-1:1fprintf('倒数 %d\n',i)end

遍历矩阵的列:

A=[147;258;369];% for循环遍历矩阵时,每次取一列forcol=Adisp(col)% 每次col是一个列向量end

遍历cell数组:

files={'data1.csv','data2.csv','data3.csv'};fork=1:length(files)data=readmatrix(files{k});fprintf('文件 %s 加载了 %d 行数据\n',files{k},size(data,1))end

预分配内存(重要性能技巧):

% 错误示范:动态扩容,每次循环都要重新分配内存,速度极慢result=[];fori=1:10000result=[result,i^2];% 每次都复制整个数组end% 正确做法:提前分配好大小result=zeros(1,10000);% 预分配fori=1:10000result(i)=i^2;% 只填值,不重新分配end

这个差别在数据量大时非常明显,10000次循环可能差10倍速度。


while 循环

当循环次数不确定时用while:

% 牛顿法求平方根x=2.0;% 初始猜测target=10.0;whileabs(x^2-target)>1e-8x=(x+target/x)/2;endfprintf('sqrt(%.1f) ≈ %.10f\n',target,x)

防止死循环:

max_iter=1000;iter=0;whilecondition&&iter<max_iter% 迭代计算...iter=iter+1;endifiter>=max_iterwarning('达到最大迭代次数,可能未收敛')end

工程代码里,while循环一定要设置最大迭代次数保护,否则算法不收敛时程序会一直卡着。


break 和 continue

break:提前结束循环

% 找第一个大于10的元素data=[3,7,2,15,4,9];found_idx=-1;fori=1:length(data)ifdata(i)>10found_idx=i;break% 找到就立即跳出endend% 更简洁的写法(向量化)found_idx=find(data>10,1,'first');

continue:跳过本次,继续下次

% 只处理正数data=[1,-2,3,-4,5,-6];result=zeros(size(data));fori=1:length(data)ifdata(i)<=0continue% 跳过负数和零endresult(i)=sqrt(data(i));end

同样,continue的用途大多可以用逻辑索引替代,性能更好:

result=zeros(size(data));pos=data>0;result(pos)=sqrt(data(pos));

try-catch 异常处理

读文件、调外部函数时,错误处理必不可少:

filenames={'data1.csv','missing.csv','data3.csv'};results=cell(length(filenames),1);fork=1:length(filenames)trydata=readmatrix(filenames{k});results{k}=mean(data(:));fprintf('✓ %s 处理完成,均值=%.4f\n',filenames{k},results{k})catchME% ME是MException对象fprintf('✗ %s 失败:%s\n',filenames{k},ME.message)results{k}=NaN;endend

获取错误信息:

tryx=1/0;% 不会报错,InfA=[12;34];A(5,5)% 这会报错catchMEfprintf('错误ID:%s\n',ME.identifier)fprintf('错误信息:%s\n',ME.message)fprintf('发生位置:%s 第%d行\n',ME.stack(1).name,ME.stack(1).line)end

自定义错误和警告:

functionresult=safeDivide(a,b)ifb==0error('safeDivide:zeroDenominator','除数不能为零')endifabs(b)<1e-10warning('safeDivide:smallDenominator','除数接近零,结果可能不可靠')endresult=a/b;end

error会终止执行并抛出异常,warning只显示警告信息但继续执行。


什么时候用循环,什么时候用向量化

这是MATLAB学习的一个重要思维转变:

适合向量化(不用循环):

% 计算1到1000每个数的正弦值x=1:1000;y=sin(x);% 直接作用于整个向量,内部是高度优化的C代码% 找所有大于均值的元素data=randn(1,10000);above_mean=data(data>mean(data));% 对矩阵每行求和A=rand(100,50);row_sums=sum(A,2);% 按行求和,返回100x1向量

不得不用循环的情况:

% 有前后依赖关系的递推计算x(1)=1;fori=2:100x(i)=x(i-1)*2+sin(i);% 依赖上一步结果end% 每次迭代的输入由上次迭代结果决定whilenot_converged x_new=update(x_old);% 迭代格式ifnorm(x_new-x_old)<tolbreakendx_old=x_new;end% 需要中途终止的循环fori=1:n result=compute(i);ifisnan(result)||result>thresholdbreakendend

核心判断:数据处理用向量化,迭代算法和递推用循环。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/31 2:47:11

51单片机动态数码管显示:从原理到实践,实现学号稳定显示

1. 项目概述&#xff1a;从静态到动态的显示跃迁刚接触51单片机的朋友&#xff0c;很多都是从点亮一个LED灯或者让一个数码管显示数字开始的。这就像学编程的“Hello World”&#xff0c;是建立信心的第一步。但很快你就会发现&#xff0c;单个数码管能显示的信息太有限了&…

作者头像 李华
网站建设 2026/7/31 2:47:05

光学工程师必备:中英文术语对照表与实战应用指南

1. 项目缘起&#xff1a;为什么需要一份自己的光学名词对照表&#xff1f;在光学这个领域摸爬滚打了十几年&#xff0c;从实验室的激光器调试&#xff0c;到产线的镜头模组检测&#xff0c;再到如今各种消费电子产品的光学设计评审&#xff0c;我越来越深刻地体会到一件事&…

作者头像 李华
网站建设 2026/7/31 2:46:40

Cadence Virtuoso版图设计全流程解析:从DRC规则到LVS验证的实战指南

1. 项目概述&#xff1a;从原理图到物理实现的桥梁在模拟和混合信号集成电路设计的漫长流程中&#xff0c;有一个环节既充满艺术性&#xff0c;又要求极致的严谨性&#xff0c;那就是版图设计。如果说电路原理图是设计师构思的“乐谱”&#xff0c;那么版图就是最终能被芯片制造…

作者头像 李华
网站建设 2026/7/31 2:41:16

层次分析法实战:用yaahp量化决策,告别主观判断

1. 项目概述&#xff1a;从决策焦虑到量化清晰 做项目评审、方案选型&#xff0c;或者哪怕只是团队内部评个优秀员工&#xff0c;你是不是也经常遇到这种场面&#xff1f;几个人围在一起&#xff0c;各说各的好&#xff0c;A方案技术领先但成本高&#xff0c;B方案风险低但周期…

作者头像 李华
网站建设 2026/7/31 2:31:47

3分钟掌握视频硬字幕提取:本地OCR工具让字幕制作变得简单高效

3分钟掌握视频硬字幕提取&#xff1a;本地OCR工具让字幕制作变得简单高效 【免费下载链接】video-subtitle-extractor 视频硬字幕提取&#xff0c;生成srt文件。无需申请第三方API&#xff0c;本地实现文本识别。基于深度学习的视频字幕提取框架&#xff0c;包含字幕区域检测、…

作者头像 李华
网站建设 2026/7/31 2:30:49

三步解锁PSVita隐藏潜能:Adrenaline固件终极配置指南

三步解锁PSVita隐藏潜能&#xff1a;Adrenaline固件终极配置指南 【免费下载链接】Adrenaline Custom Firmware 6.61 Adrenaline for the PSP Emulator 项目地址: https://gitcode.com/gh_mirrors/adr/Adrenaline 你是否想让手中的PS Vita变身为强大的PSP游戏机&#xf…

作者头像 李华