结构化程式与自定义函数
前言
【台大郭彦甫】PPT链接:https://pan.baidu.com/s/1VXdy3HCBPexMK0csyehiZA 提取码:2io1
matlab官方帮助文档:https://ww2.mathworks.cn/help/
一、脚本编写(.m文件)
首先点击左上角新建脚本按钮,将代码复制进窗口,点击F5或者Run保存文件
for i=1:10
x=linspace(0,10,101);
plot(x,sin(x+i));
print(gcf,'-deps',strcat('plot',num2str(i),'.ps'));
end
- 文件命名:不可以数字开头;大小写有区别
- 注释:全选右键
- “%%”将整个脚本文件分为若干“节”,可以选择“运行当前节”来执行某部分代码,方便debug
% %
for i=1:10
x=linspace(0,10,101);
plot(x,sin(x+i));
print(gcf,'-deps',strcat('plot',num2str(i),'.ps'));
end
% %
for i=1:10
x=linspace(0,10,101);
plot(x,sin(x+i));
print(gcf,'-deps',strcat('plot',num2str(i),'.ps'));
end
- 也可以添加断点debug,此时鼠标悬停于变量上可以查看该变量详细信息,可点击继续,运行后半部分代码
- 如图,右键智能缩进
二、结构化程序设计
1.逻辑运算符
注意:matlab中的不等于:~=
其他与c一致:
2.控制语句
- if-elseif-else
条件为 true 时执行语句
if expression
statements
elseif expression
statements
else
statements
end
eg.rem(x,y):求整除x/y的余数
a=3;
if rem(a, 2) == 0
disp('a is even')
else
disp('a is odd')
end
- swith
执行多组语句中的一组
switch switch_expression
case case_expression
statements
case case_expression
statements
...
otherwise
statements
end
eg.
input_num = 1;
switch input_num
case -1
disp('negative 1');
case 0
disp('zero');
case 1
disp('positive 1');
otherwise
disp('other value');
end
- while
条件为 true 时重复执行的 while 循环
while expression
statements
end
eg.prod()函数用于求数组元素的乘积;
prod(1,n)表示n!;1e100 = 1×10的100次方
n = 1;
while prod(1:n) < 1e100
n = n + 1;
end
运行之后不显示结果,在命令行窗口输入n,得到70
练习
sum=0;
i = 1;
while i < 1000
sum=sum+i
i = i + 1;
end
fprintf('和为:%d\n',sum);
- for
用来重复指定次数的 for 循环
for index = values % values为start:increment:end
statements
end
eg.
for n=1:10
a(n)=2^n;
end
disp(a)
运行后修改为下面代码,发现结果相同,是因为此时a已经在内存中,需要clear a之后再计算
for n=1:2:10
a(n)=2^n;
end
disp(a)
- break
终止执行 for 或 while 循环
x = 2; k = 0; error = inf;
error_threshold = 1e-32;
while error > error_threshold
if k > 100
break
end
x = x - sin(x)/cos(x);
error = abs(x - pi);
k = k + 1;
end
3.为变量预分配空间
- 如果未预分配空间,matlab会在每次迭代时调整其大小,会比较费时间
- 若一个变量所需要的内存空间是一个可预测的定值,我们应尽量提前为其分配内存空间。
使用范例:
- tic-toc可以用于计时。
tic
for ii = 1:2000
for jj= 1:2000
A(ii,jj) = ii + jj;
end
end
toc
tic
A = zeros(2000, 2000);
for ii = 1:size(A,1)
for jj = 1:size(A,2)
A(ii,jj) = ii + jj;
end
end
toc
练习
方法1:
A = [0 -1 4
9 -14 25
-34 49 64]
B = zeros(size(A));
for i = 1:size(A,1)
for j = 1:size(A,2)
if(A(i,j)<0)
B(i,j)=1;
A(i,j)=0;
end
end
end
- size(A,1)求矩阵的行数
- size(A,2)求矩阵的列数,相当于length(a)
- size(A)同时求矩阵的行和列数
方法2:
A = [0 -1 4
9 -14 25
-34 49 64]
B = A < 0
A(B) = 0
- B = A < 0
返回一个零一矩阵,数组A中小于0的位置为1 - A(B) = X(未知)
X : 与 B 大小一样(行数和列数相等)
4.编写脚本时应注意的问题
-
clear all
清除工作区内存中的变量
close all
关闭之前程序绘制的图像
clc
清空之前程序在终端的输出 -
在所有运算和赋值语句都应该添加分号; 抑制输出,若需要向终端输出一个变量,应对其调用disp方法.
-
在matlab中,省略号…可以将多行语句拼接为一行,灵活使用该语句可以提高代码可读性.
A = [1 2 3 4 5 6; ...
6 5 4 3 2 1];
- 按Ctrl+C提前结束运行
三、自定义函数
与脚本类似,自定义函数可以被存入函数名.m文件中,也可以以函数句柄的形式定义在内存中。
1.查看内置函数
-
我们可以使用
which
命令查看内置函数源代码文件的位置,与edit
命令结合可以查看内置函数的源代码. -
运行下面语句可以打开matlab内置的mean函数的源文件:
edit(which('mean.m'))
- 可以在编辑器中看到:
2.function的编写
- 关键字: function … end 结尾
- 函数保存的.m文件,函数名必须和文件名一致;
- 也可将临时使用的函数定义在脚本文件内,但需要定义在文件最后;
- 输入 input();输出可以用 disp() 或者 fprintf()
注意 matlab 中对于字符串均使用 ‘’ 而不是 “” ,fprintf() 中的内容使用 ''括起来;
eg.
- 自由落体运动中位移量:
将下列代码保存至freebody.m文件中,在命令行窗口可使用
function x = freebody(x0,v0,t)
% calculation of free falling
% x0: initial displacement in m
% v0: initial velocity in m/sec
% t: the elapsed time in sec
% x: the depth of falling in m
x = x0 + v0.*t + 1/2*9.8*t.*t;
>> freebody(0,0,10)
ans =
490
MATLAB编程技巧 :计算乘法时应尽量使用.*
而非*
,因为前者不仅对参数t为标量的情况可用,也对变量t为向量或矩阵的情况可用.
如下:
>> freebody([0,1],[0,1],[10,10])
ans =
490 501
- 定义多参数或多返回值(多输入输出)的函数:
将下列代码保存至acc.m文件中,在命令行窗口可使用
function[a, F] = acc(v2,v1,t2,t1,m)
a = (v2-v1)./(t2-t1);
F = m.*a;
>> [Acc Force]=acc(20,10,5,4,1)
Acc =
10
Force =
10
练习
从华氏温度转换到摄氏温度:
function F2C()
while 1
F = input('请输入华氏温度:','s');
F = str2num(F);
if isempty(F)
return
end
C = (F-32)*5/9;
disp(['摄氏温度为:',num2str(C)])
end
>> F2C
请输入华氏温度:12
摄氏温度为:-11.1111
请输入华氏温度:11 22 33
摄氏温度为:-11.6667 -5.55556 0.555556
最后使用ctrl+c
终止程序
3.内置的函数参数
4.使用函数句柄形式定义函数
function_handle是一种创建匿名函数的方法,即不必在 .m
文件中定义的单行表达式函数。
f = @(x) exp(-2*x);
x = 0:0.1:2;
plot(x, f(x));
- function handles 其实是一个指针,它使
f
指向函数exp(-2*x)
;f
的输入在@(x)
处,此处的x
则将成为函数exp
的输入参数。
总结
以上就是第二节的内容,本部分介绍了matlab的结构化程式与自定义函数。