Matlab程序文件分为脚本文件和函数文件
例子:分别建立脚本文件和函数文件,求两个函数的矩阵的乘积
函数文件名称,一定要与函数一致
% 建立脚本文件f1.m %
A = [1,2,3;4,5,6];
B = [1,2;3,4;5,6];
C = A*B
% 在命令行窗口运行脚本文件 %
>> f1
C =
22 28
49 64
% 建立函数文件f2.m %
function C = f2(A,B)
C = A*B;
% 命令行中调用函数文件 %
>> A = [1,2,3;4,5,6];
>> B = [1,2;3,4;5,6];
>> C = f2(A,B)
C =
22 28
49 64
一、顺序结构程序
输入、处理(核心)、输出
1、数据的输入
A = input('请输入变量A的值')。
2、数据输出
disp(输出项):与不加分号相比,用disp函数输出的数据更加紧凑。
3、程序的暂停
pause(延时秒数),若延时秒数省略,则程序会暂停执行。
若要强行终止程序的运行可以使用Ctrl+C命令。
%{
有一线段AB,A的坐标为(1,1),B的坐标为(4.5,4.5),
求AB的长度,以及黄金分割点C的坐标。
A、B点坐标用复数的形式表示,方便计算。
%}
clear
clc
a = input('a=');
b = input('b=');
c = a+0.618*(b-a);
s = abs(a-b);
disp(s);
disp(c);
%命令行交互
a=1+1i
b=4.5+4.5i
4.9497
3.1630 + 3.1630i
二、用if语句实现选择结构
1、单分支if 语句格式:
if 条件
语句组
end
1、当条件结果为标量时,非零表示条件成立,零表示条件不成立。
2、当条件结果为矩阵时,如果矩阵为非空,且不包含零元素,则条件成立,否则不成立。
2、双分支if语句格式:
if 条件
语句组1
else
语句组2
end
%输入一个整数,若为奇数则输出其平方根,否则输出其立方根 c = input('请输入一个整数:'); if rem(c,2) == 0 d = sqrt(c); else d = nthroot(c,3); end disp(d);
3、 多分支if语句格式
if 条件1
语句组1
else if 条件2
语句组2
......
else if 条件m
语句组m
else
语句组n
end
%{ 输入一个字符,若为大写字母,则输出其对应的小写字 母;若为小写字母,则输出其对应的大写字母:若为数字字 符则输出其对应数的平方,若为其他字符则原样输出。 %} clear clc x = input('请输入一个字符:'); if x >= 'A'&& x <= 'Z' disp(char(abs(x)+'a'-'A')); elseif x >= 'a' && x <= 'z' disp(char(abs(x)- 32)); elseif x >= '0' && x <= '9' disp(str2double(x)^2); else disp(x) end
lower(字符):输入:大写字母字符;输出:小写字母字符
upper(字符):输入:小写字母字符;输出:大写字母字符
str2double(字符):输入:数字字符串;输出为:双精度数值
三、用switch语句实现选择结构
%{ switch语句,简单例子 %} clear clc x = input('x=') switch fix(x) case 2 disp(222); % fix(x) = 2;执行此语句 case 2 disp(333); % fix(x) = 任何数;都不会执行此语句 case {3,4,5} disp(444); % fix(x) = 3,4,5;执行此语句 otherwise disp(555); % fix(x) = 其它数;执行此语句 end
x = input(prompt) x = prompt
str = input(prompt,'s') 返回输入的文本,而不会将输入作为表达式来计算。即:此时输入apple,str = 'apple'
% PM2.5 等级设置 % g = input('请输入PM2.5值:'); switch fix(g) case num2cell(0:34) % 0 <= g <=34时,执行该条件成立时的语句。 disp('空气质量优'); case num2cell(35:74) disp('空气质量良好'); case num2cell(75:114) disp('空气质量轻度污染'); case num2cell(15:149) disp('空气质量中度污染'); case num2cell(159:249) disp('空气质量重度污染'); otherwise disp('空气质量严重污染'); end
四、用for语句实现循环结构
for 循环变量 = 表达式1(初值):表达式2(步长):表达式3(终值),这些构成一个向量
循环体语句(重复执行的语句)
end
(1)for语句针对向量中的每一个元素执行一次循环体。
(2)退出循环后,循环变量的值就是向量中最后的元素值。
(3)当向量为空时,循环体一次也不执行。
%计算圆周率Π,原理是无穷级数 format long y = 0; g = -1; n = input('n='); for i = 1:n g = -g; y = y + g*1/(2*i-1); end pai = 4*y %计算圆周率Π,利用四分之一圆的单位圆 a = 0; b = 1; n = input('n =?'); h = (b-a)/n; x = a:h:b; f = sqrt(1-x.*x); s = []; for k = 1:n s1 = (f(k)+f(k+1))*h/2; s = [s,s1]; end pai = 4*sum(s) %利用蒙特卡洛法求Π的近似值 s = 0; n = input('n=?'); for i = 1:n x = rand(1); y = rand(1); if x*x+y*y<=1 s = s+1; end end pai = (s/n)*4
按照 MATLABE的定义,for语句的循环变量也可以是一个
列向量(以上的特例,可以看作每列元素只有一个数),其格式为:for 循环变量 = 矩阵表达式
循环体语句
end
例如
% for k = [1,2,3,4] %
s = 0;
for k =[1,2,3,4]
s= s+1;
end
disp(['第一个执行次数:',s]);
disp(s);
disp(['第一个k的数值:',k]);
disp(k);
% for k = [1;2;3;4] %
s = 0;
for k = [1;2;3;4]
s = s+1;
end
disp(['第二个执行次数:']);
disp(s);
disp(['第二个k的数值:']);
disp(k);
命令行结果:
第一个执行次数:
4
第一个k的数值:
4
第二个执行次数:
1
第二个k的数值:
1
2
3
4
五、用while语句实现循环结构
while 条件
循环体语句
end
例子:
%例1从键盘输入若干个数,当输入0时结束输入,求这些数的平均值和它们之和。 n = 0; su = 0; x = input('x = '); while x ~= 0 n = n + 1; su = su + x; x = input('x = '); end disp('和:'); disp(su); disp('均值:'); disp(su/n);
while语句多用于循环次数不确定的情况,而对于循环次数确定的情况,使用for语句更方便。
针对不同情况可以选择不同的循环语句,但从功能上讲两种循环语句可以相互替代。
流程转向语句,break语句和continue语句
(1)break语句:用来跳出循环体,结束整个循环。
(2)continue语句:用来结束本次循环,接着进行下一次是否执行循环的判断。
%求 [100,200] 之间第一个能被21整除的整数 for k = 100:200 if rem(k,21) == 0 break; end end disp(k); %求 [100,200] 之间第一个能被21整除的整数,另一种思路 for n = 100:200 if rem(n,21)~=0 continue end n break end
循环的嵌套
例程:(没懂的算法)
例3用筛选法求某自然数范围内的全部素数
筛选法求素数的基本思想:要找出2m之间的全部素数,首先在2~m中
划去2的倍数(不包括2),然后划去3的倍数(不包括3),由于4已
被划去,再找5的倍数(不包括5),…,直到再划去不超过m的倍
数,剩下的数就都是素数了。%用筛选法求某自然数范围内的全部素数 m = input('m='); p = 1:m; p(1) = 0; for i = 2:sqrt(m) for j=2*i:i:m p(j)=0; end end n = find(p~=0); p(n)
六、函数文件的定义与调用
1、普通函数
函数文件的基本结构:
function 输出形参表 = 函数名(输入形参表)
注释说明部分
函数体语句
当有多个形参时,形参之间用逗号分隔,组成形参表。当输出形参多于一个时,应该用方括号括起来,构成一个输出矩阵。
函数文件名通常由函数名再加上扩展名.m组成,函数文件名与函数名也可以不相同。
(一般推荐将函数文件名与函数名统一)
Return语句:用于结束函数的执行。
例子:定义一个知道半径r,求圆面积、周长的函数,并调用
% 求圆的面积和周长的函数定义 function [S,L] = cy(r) S = pi*r^2; L = 2*pi*r; end
% 求圆面积和周长函数的调用 r = input('r = ') [S,L] = cy(r); disp('面积:'); disp(S); disp('周长:'); disp(L);
2、匿名函数
基本格式:
函数句柄变量=@(匿名函数输入参数)匿名函数表达式
例程:
>> f = @(x,y)x^2+y^2; %匿名函数的定义,输入形参为x、y,返回值为x^2+y^2的运算结果。 f(3,4) %调用匿名函数 ans = 25
不仅可以给函数表达式定义句柄,还可以给已经存在的函数(包括内部函数、自定义函数)定义句柄。
>> ccc =@ cos %为cos()函数定义句柄,以后可以用CCC() 来调用cos() 函数
ccc =
包含以下值的 function_handle:
@cos
>> ccc(pi)
ans =
-1.00
七、函数的递归调用
1、直接递归调用
如:f函数直接调用f函数本身
2、间接递归调用
如:f函数调用了其他函数,而其他函数调用了f函数
例程:
% 利用函数的递归调用,求n!。
fmult.m 文件如下
function nn = fmult(n)
if n<=1
nn = 1;
else
nn = n*fmult(n-1);
end
递归编程 的 关键是想清楚 递归表达式,也就是算法。这很重要!!!
八、函数参数与变量的作用域
1、函数参数的可调性
Matlab在函数调用上有一个特点,就是函数所传递参数数目是可调的。
在调用函数时,Matlab有两个预定义变量,
nargin 记录输入实参的个数
nargout 记录输出实参的个数
2、参数的作用域
% 可以根据输入参数个数的不同,进行判断,并执行相关语句
function fout = test1(a,b,c)
if nargin == 1
fout =a;
elseif nargin ==2
fout = a+b;
elseif nargin ==3
fout=(a*b*c)/2;
end
end
局部变量,是指在程序中只在特定过程或函数中可以访问的变量。
全局变量的作用域是整个MATLAB工作空间,也就是全程有效,所有的函数都可以对它进行存取和修改。
全局变量的应用实例:
function f = wad(x,y)
global ALPHA BETA
f = ALPHA*x + BETA*y;
end
调用全局变量需要在命令行窗口声明一下全局变量。
global ALPHA BETA