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 ~= 2
error('需要两个输入参数');
end
if ~isnumeric(a) || ~isnumeric(b)
error('输入参数必须是数值类型');
end
result = a + b;
end
调用方法:
>> r = myadd(3, 5)
r =
8
需要注意函数文件必须在当前工作路径中,否则索引不到。
3.带多个输出的函数示例
定义一个计算平均值与标准差的函数 mystat.m
。
function [avg, s] = mystat(x)
% mystat: 返回平均值和标准差
if nargin ~= 1
error('需要一个输入向量');
end
if ~isvector(x) || ~isnumeric(x)
error('输入必须是数值向量');
end
n = 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;
end
function z = helperfunc(x)
z = x^2;
end
流程控制
1. if
条件语句
用于执行满足条件的代码块。
语法:
if 条件1
% 条件1为真时执行的语句
elseif 条件2
% 条件2为真时执行的语句
else
% 所有条件不满足时执行
end
示例:
x = 5;
if x > 10
disp('x 大于 10');
elseif x == 5
disp('x 等于 5');
else
disp('x 小于或等于 10 且不等于 5');
end
x 等于 5
2. switch
多分支选择语句
根据变量的值选择执行哪个代码块,适用于多个固定值的判断。
语法:
switch 变量
case 值1
% 变量等于值1时执行
case 值2
% 变量等于值2时执行
otherwise
% 所有情况都不匹配时执行
end
示例:
day = 'Monday';
switch day
case 'Monday'
disp('今天是星期一');
case 'Tuesday'
disp('今天是星期二');
otherwise
disp('不是星期一也不是星期二');
end
今天是星期一
3. try-catch
异常处理语句
用于捕捉运行时错误,使程序即使遇到异常也不会中断运行。
语法:
try
% 尝试执行的代码
catch 异常变量
% 出错时执行的代码
end
示例:
>> try
result = 10 / a
catch ME
disp('发生错误:');
disp(ME);
end
发生错误:
MException - 属性:
identifier: 'MATLAB:UndefinedFunction'
message: '函数或变量 'a' 无法识别。'
cause: {}
stack: [0x1 struct]
Correction: []
>>
ME与lasterr
在早期 MATLAB 版本中,catch 子句不接变量名,错误信息由内置变量 lasterr 存储。示例如下:
>> try
result = 10 / a;
catch
disp('出错:');
disp(lasterr); % 显示最后一条错误信息
end
出错:
函数或变量 'a' 无法识别。
lasterr 是一个全局变量,保存最后发生的错误信息。
在新版本 MATLAB 中(R2010+),推荐使用结构化异常对象 MException 处理错误。catch 后可以接一个变量(如 ME),此变量就是一个 MException 对象。
try
result = 10 / 0;
catch ME
disp('发生错误:');
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 <= 5
disp(['当前 i = ', num2str(i)]);
i = i + 1;
end
当前 i = 1
当前 i = 2
当前 i = 3
当前 i = 4
当前 i = 5
5. for
循环语句
用于对已知范围的变量进行迭代。
语法:
for 变量 = 向量或数组
% 循环体
end
示例:
for i = 1:5
disp(['i = ', num2str(i)]);
end
i = 1
i = 2
i = 3
i = 4
i = 5
break和continue
控制语句 | 说明 |
---|---|
break | 终止当前循环 |
continue | 跳过当前循环的剩余部分,直接进入下一轮 |
示例:
for i = 1:10
if mod(i, 2) == 0
continue; % 跳过偶数
end
if i > 7
break; % 超过 7 时跳出循环
end
disp(i);
end
1
3
5
7