本文学习 MATLAB教学_03结构化程式与自定义函数。视频地址为:https://www.bilibili.com/video/av68228488?p=3
本文主要学习三个内容:
- 脚本编写
- 结构化程序
- 用户自定义函数
小技巧
clear all %移除在工作区的所有变数
close all %关闭所有的图形
Ctrl+C 可以强制退出正在运行的程序
clc 在命令行窗口输入clc可以清屏
A=[1 2 3 4 5 6;... %...是换行,系统默认下面输入的是同一行
6 5 4 3 2 1]
MATLAB文件格式
MATLAB的程序需要保存为 *.m 的格式。
小提示:可以把脚本写到一个 m文件里。然后用 ‘%%’ 分成不同的section. 然后运行 run section 就可以在运行不同的模块。用断点的话可以在此行停止,然后去观察工作区,看变数的值是多少。以此来判断。
结构化程序语言
类似于C语言的关键字。
逻辑符号:
if elseif else
a =-3; %28分钟练习
if rem(a,2) == 0 % rem()函数 就是 除后的余数
disp('a is even')
else
disp('a is odd')
end
注意:
- 在这里没有用 a/2,是因为a/2的数依然会是偶数或者是奇数,还要再进行判断。
- 这里也可以用 mod 来代替 rem。 虽然 最后结果是一样的。但是若我们在程式后面来显示 mod(a,2) 和 rem(a,2 ) 的话,结果却不一样。教程中提到取模(mod)与取余(rem)是不同的:
<1> 当x和y的正负号一样的时候,两个函数结果是等同的;
<2> 当x和y的符号不同时,rem函数结果的符号和x的一样,而mod和y一样。
<3> 这是由于这两个函数的生成机制不同,rem函数采用fix函数,而mod函数采用了floor函数(这两个函数是用来取整的,fix函数向0方向舍入,floor函数向无穷小方向舍入)。
此段内容参考: https://blog.csdn.net/u013066730/article/details/53840461
关于print、fprintf、fscanf、disp
print函数可以把函数保存为图片;
print('-dpng','sin.png') 表示保存为png图片,文件名为sin.png
fprintf函数可以将数据按指定格式写入到文本文件中;
fscanf函数是读取文本文件中的数据;
disp函数是直接将内容输出在MATLAB命令窗口中;
这里有一篇博客可以参考 :https://blog.csdn.net/qq_35860352/article/details/82155860
switch
input_num = 1; %35分钟练习
switch input_num %根据不同的值,选择不同的case,如果没有合适的,就选择otherwise
case -1
disp('negative 1');
case 0
disp('zero');
case 1
disp('positive 1');
otherwise
disp('other value');
end
while
n = 1; %40分钟练习
while prod(1:n) < 1e100 %prod 这个函数相当于是 n!, 后面的1e100是 1* 10^100
n=n+1;
end
n %显示n,要不不知道n是多少
44分钟练习
n = 0; %44分钟练习
sum=0;
while n<999 %因为while里第一句就是n=n+1,所以n=998时,里面的n=n+1=999,
n=n+1;
sum=sum+n;
end
sum
n
for
clear;
for n=1:10 %49分练习
%这里如果只写了n=1:10,则是从1到10,默认每次增加1,若再加一个,如:n=1:0.1:10,则是从1到10,每次
%增加0.1
a(n)=2^n; %这里是把a设置为了一个向量,随着n的增加保存到a这个向量的第1个元素,第2个,一直到第10个元素
end
disp(a)
注意:这里讲到一个clear。比如你以前有个变数 a, 但是在运行新程序时把以前的 a 没有清除,那保存的还是以前的数据。
%%
clear;
for n=1:5 %56分练习第1个方法
a(n)=2^(n*2-1); %改变a(n)后面显示的指数,
end
disp(a)
%%
clear; %56分练习第2个方法
i=1;
for n=1:2:10
a(n)=2^n;
if a(n) ~=0; %因为如果这个数没有指定的话,那么就是0。把这些非0的留下,是0的删除,组成新的向量
b(i)=a(n);
end
i=i+1;
end
tic
代码 ;计算运行这段代码所使用的时间
toc
64分钟练习
%%
clear; %64分钟练习
A=[0 -1 4; 9 -14 25; -34 49 64];
for i=1:3
for j=1:3
if A(i,j)>=0
B(i,j)=A(i,j); %如果A(i,j)>=0,则直接赋值给B(i,j)
else
B(i,j)=rand(); %如果A(i,j)<0,则赋值给B(i,j)一个随机数,rand()是随机数函数
end
end
end
format short; %改变格式是为了方便观察
A
B
break
在满足条件时可以跳出来,或者为了避免程序宕机,可以使用。
edit(which(mean.m)) % edit是编辑函数, which是一个关键字,表示这个所指的位置在哪
脚本与函数
脚本 | 函数 |
---|---|
没有输入 | 有输入 |
没有输出 | 有输出 |
运算保存在全局 | 运算只保存在局部 |
脚本是最简单的程序类型,因为它们存储命令的方式与您在命令行中键入命令完全相同。脚本没有输入输出,但是它的结果是保存在工作区的,并且是全局变量。但是,函数更灵活,更容易扩展。每次调用的时候并不需要一次次修改它的输入值。
点乘的重要性
如果你的这个输入量是一个矩阵,那是希望在这个矩阵里实现点乘,每个矩阵都和对应的元素相每次。例如:
function x= freebody(x0,v0,t)
x=x0+v0.*t+1/2*9.8*t.*t;
...
freebody([0 1],[0 1],[0 20]) %正是因为上面的函数有了点每次。所以进行时相当于是freebody(0,0,0)和freebody(1,1,20);
%如果这里没有点乘,则会出错
90分钟练习题
%%
clear all;
close all; %90分钟练习
while 1
F=input('请输入一个温度:');
if isempty(F)==1
break
end
C=(F-32).*5/9;
disp(C)
end
%%
clc
clear all;
close all; %90分钟练习第二个方法
a=1;
while a
disp('请输入1或者2,1代表转换温度,2代表结束程序')
F=input('请输入一个数:');
switch F
case 1
Temp=input('请输入一个温度:');
if isempty(Temp)==1
break
end
C=(Temp-32).*5/9;
disp(C)
case 2
a=0;
otherwise
disp('wrong number,please input a number again')
end
end
匿名函数
f=@(x) exp(-2 *x); x是它的输入,后面的(-2 *x) 是它的表达式。