Matlab程序设计基础
matlab程序设计基础
- 程序设计
- 函数文件
- 1.函数文件的基本结构
- 2.创建并使用函数文件的示例
- 3.带多个输出的函数示例
- 4.包含子函数的函数文件
- 流程控制
- 1. `if` 条件语句
- 2. `switch` 多分支选择语句
- 3. `try-catch` 异常处理语句
- ME与lasterr
- 4. `while` 循环语句
- 5. `for` 循环语句
- break和continue
程序设计
函数文件
在 MATLAB 中,函数文件(Function File) 是用于定义自定义函数的基本方式,扩展名为 .m
。它可以接收输入参数,执行一系列操作并返回结果。
1.函数文件的基本结构
函数文件以 function
开头,其基本结构如下:
function [输出1, 输出2, ...] = 函数名(输入1, 输入2, ...)% 函数说明% 执行语句
end
- 文件名必须和函数名一致,例如函数叫
myadd
,文件名必须是myadd.m
。 - 可定义多个输入和多个输出。
- 一个函数文件只能有一个主函数,可以包含多个子函数。
2.创建并使用函数文件的示例
定义一个加法函数 myadd.m
。
function result = myadd(a, b)% myadd: 返回 a + b 的结果% 输入检查if nargin ~= 2error('需要两个输入参数');endif ~isnumeric(a) || ~isnumeric(b)error('输入参数必须是数值类型');endresult = a + b;
end
调用方法:
>> r = myadd(3, 5)
r =8
需要注意函数文件必须在当前工作路径中,否则索引不到。
3.带多个输出的函数示例
定义一个计算平均值与标准差的函数 mystat.m
。
function [avg, s] = mystat(x)% mystat: 返回平均值和标准差if nargin ~= 1error('需要一个输入向量');endif ~isvector(x) || ~isnumeric(x)error('输入必须是数值向量');endn = length(x);avg = sum(x) / n;s = sqrt(sum((x - avg).^2) / (n - 1));
end
调用方法:
>> [mean_val, std_val] = mystat([1 2 3 4 5])
mean_val =3
std_val =1.5811
4.包含子函数的函数文件
一个函数文件中可以包含多个函数,但只有**第一个函数(主函数)**是对外可见的,其他的是子函数,仅供主函数调用。
function y = mainfunc(x)y = helperfunc(x) + 1;
endfunction z = helperfunc(x)z = x^2;
end
流程控制
1. if
条件语句
用于执行满足条件的代码块。
语法:
if 条件1% 条件1为真时执行的语句
elseif 条件2% 条件2为真时执行的语句
else% 所有条件不满足时执行
end
示例:
x = 5;
if x > 10disp('x 大于 10');
elseif x == 5disp('x 等于 5');
elsedisp('x 小于或等于 10 且不等于 5');
end
x 等于 5
2. switch
多分支选择语句
根据变量的值选择执行哪个代码块,适用于多个固定值的判断。
语法:
switch 变量case 值1% 变量等于值1时执行case 值2% 变量等于值2时执行otherwise% 所有情况都不匹配时执行
end
示例:
day = 'Monday';
switch daycase 'Monday'disp('今天是星期一');case 'Tuesday'disp('今天是星期二');otherwisedisp('不是星期一也不是星期二');
end
今天是星期一
3. try-catch
异常处理语句
用于捕捉运行时错误,使程序即使遇到异常也不会中断运行。
语法:
try% 尝试执行的代码
catch 异常变量% 出错时执行的代码
end
示例:
>> tryresult = 10 / acatch MEdisp('发生错误:');disp(ME);end
发生错误:MException - 属性:identifier: 'MATLAB:UndefinedFunction'message: '函数或变量 'a' 无法识别。'cause: {}stack: [0x1 struct]Correction: []>>
ME与lasterr
在早期 MATLAB 版本中,catch 子句不接变量名,错误信息由内置变量 lasterr 存储。示例如下:
>> tryresult = 10 / a;
catchdisp('出错:');disp(lasterr); % 显示最后一条错误信息
end
出错:
函数或变量 'a' 无法识别。
lasterr 是一个全局变量,保存最后发生的错误信息。
在新版本 MATLAB 中(R2010+),推荐使用结构化异常对象 MException 处理错误。catch 后可以接一个变量(如 ME),此变量就是一个 MException 对象。
tryresult = 10 / 0;
catch MEdisp('发生错误:');disp(ME.message); % 错误消息字符串disp(ME.identifier); % 错误标识符(如'MATLAB:divideByZero')disp(ME.stack(1)); % 错误发生的位置(文件、行号、函数)
end
MException 对象详解:
当错误发生时,MATLAB 会创建一个 MException 类型的对象,常用属性如下:
属性名 | 说明 |
---|---|
ME.message | 错误的文本描述 |
ME.identifier | 错误的唯一标识符 |
ME.stack | 一个结构数组,描述错误发生的函数、文件和行号 |
ME.cause | 若是嵌套异常或 rethrow,可追踪根本原因 |
4. while
循环语句
当条件为真时反复执行某段代码。
语法:
while 条件% 循环体
end
示例:
i = 1;
while i <= 5disp(['当前 i = ', num2str(i)]);i = i + 1;
end
当前 i = 1
当前 i = 2
当前 i = 3
当前 i = 4
当前 i = 5
5. for
循环语句
用于对已知范围的变量进行迭代。
语法:
for 变量 = 向量或数组% 循环体
end
示例:
for i = 1:5disp(['i = ', num2str(i)]);
end
i = 1
i = 2
i = 3
i = 4
i = 5
break和continue
控制语句 | 说明 |
---|---|
break | 终止当前循环 |
continue | 跳过当前循环的剩余部分,直接进入下一轮 |
示例:
for i = 1:10if mod(i, 2) == 0continue; % 跳过偶数endif i > 7break; % 超过 7 时跳出循环enddisp(i);
end1357