MATLAB学习摘要
数组操作和矩阵操作(Array Operations vs. Matrix Operations)
对矩阵的元素一个一个孤立进行的操作称作数组操作;而把矩阵视为一个整体进行的运算则成为矩阵操作。布朗数组操作(Boolean Array Operations)对矩阵的比较运算是数组操作,也就是说,是对每个元素孤立进行的。因此其结果就不是一个“真”或者“假”,而是一堆“真假”。这个结果就是布朗数组。
1.1矩阵的超越函数
(1)矩阵平方根sqrtm
sqrtm(A)计算矩阵A的平方根。
(2)矩阵对数logm
logm(A)计算矩阵A的自然对数。此函数输入参数的条件与输出结果间的关系和函数sqrtm(A)完全一样。
(3)矩阵指数expm、expm1、expm2、expm3
expm(A)、expm1(A)、expm2(A)、expm3(A)的功能都求矩阵指数eA。
(4)普通矩阵函数funm
funm(A,‘fun’)用来计算直接作用于矩阵A的由‘fun’指定的超越函数值。当fun取sqrt时,funm(A,‘sqrt’)可以计算矩阵A的平方根,与sqrtm(A)的计算结果一样。
1.2程序的暂停
暂停程序的执行可以使用pause函数,其调用格式为:
pause(延迟秒数)
如果省略延迟时间,直接使用pause,则将暂停程序,直到用户按任一键后程序继续执行。若要强行中止程序的运行可使用Ctrl+C命令。
例3-5输入一个字符,若为大写字母,则输出其对应的小写字母;若为小写字母,则输出其对应的大写字母;若为数字字符则输出其对应的数值,若为其他字符则原样输出。
c=input('请输入一个字符','s');
if c>='A' & c<='Z'
disp(setstr(abs(c)+abs('a')-abs('A')));
elseif c>='a'& c<='z'
disp(setstr(abs(c)- abs('a')+abs('A')));
elseif c>='0'& c<='9'
disp(abs(c)-abs('0'));
else
disp(c);
end
1.3 switch语句
switch语句根据表达式的取值不同,分别执行不同的语句,其语句格式为:
switch表达式
case表达式1
语句组1
case表达式2
语句组2
……
case表达式m
语句组m
otherwise
语句组n
end
当表达式的值等于表达式1的值时,执行语句组1,当表达式的值等于表达式2的值时,执行语句组2,…,当表达式的值等于表达式m的值时,执行语句组m,当表达式的值不等于case所列的表达式的值时,执行语句组n。当任意一个分支的语句执行完后,直接执行switch语句的下一句。
例3-6某商场对顾客所购买的商品实行打折销售,标准如下(商品价格用price来表示):
price<200没有折扣
200≤price<5003%折扣
500≤price<10005%折扣
1000≤price<25008%折扣
2500≤price<500010%折扣
5000≤price14%折扣
输入所售商品的价格,求其实际销售价格。
程序如下:
price=input('请输入商品价格');
switch fix(price/100)
case {0,1}%价格小于200
rate=0;
case {2,3,4}%价格大于等于200但小于500
rate=3/100;
case num2cell(5:9)%价格大于等于500但小于1000
rate=5/100;
case num2cell(10:24)%价格大于等于1000但小于2500
rate=8/100;
case num2cell(25:49)%价格大于等于2500但小于5000
rate=10/100;
otherwise%价格大于等于5000
rate=14/100;
end
price=price*(1-rate)%输出商品实际销售价格
1.4 try语句
语句格式为:
try
语句组1
catch
语句组2
end
try语句先试探性执行语句组1,如果语句组1在执行过程中出现错误,则将错误信息赋给保留的lasterr变量,并转去执行语句组2。
1.5循环结构
1.for语句
for语句的格式为:
for循环变量=表达式1:表达式2:表达式3
循环体语句
end
其中表达式1的值为循环变量的初值,表达式2的值为步长,表达式3的值为循环变量的终值。步长为1时,表达式2可以省略。
例3-8一个三位整数各位数字的立方和等于该数本身则称该数为水仙花数。输出全部水仙花数。
程序如下:
for m=100:999
m1=fix(m/100);%求m的百位数字
m2=rem(fix(m/10),10);%求m的十位数字
m3=rem(m,10);%求m的个位数字
if m==m1*m1*m1+m2*m2*m2+m3*m3*m3
disp(m)
end
end
s=0;
a=[12,13,14;15,16,17;18,19,20;21,22,23];
for k=a
s=s+k;
end
disp(s');
39485766
例3-11从键盘输入若干个数,当输入0时结束输入,求这些数的平均值和它们之和。
程序如下:
sum=0;
cnt=0;
val=input('Enter a number (end in 0):');
while (val~=0)
sum=sum+val;
cnt=cnt+1;
end
if (cnt > 0)
sum
mean=sum/cnt
end
1.6 break语句和continue语句
与循环结构相关的语句还有break语句和continue语句。它们一般与if语句配合使用。
break语句用于终止循环的执行。当在循环体内执行到该语句时,程序将跳出循环,继续执行循环语句的下一语句。
continue语句控制跳过循环体中的某些语句。当在循环体内执行到该语句时,程序将跳过循环体中所有剩下的语句,继续下一次循环。
例3-12求[100,200]之间第一个能被21整除的整数。
程序如下:
for n=100:200
if rem(n,21)~=0
continue
end
break
end
n
1.7函数调用
函数调用的一般格式是:
[输出实参表]=函数名(输入实参表)
要注意的是,函数调用时各实参出现的顺序、个数,应与函数定义时形参的顺序、个数一致,否则会出错。函数调用时,先将实参传递给相应的形参,从而实现参数传递,然后再执行函数的功能。
(1)函数文件的基本结构
函数文件由function语句引导,其基本结构为:
function输出形参表=函数名(输入形参表)
注释说明部分
函数体语句
其中以function开头的一行为引导行,表示该M文件是一个函数文件。函数名的命名规则与变量名相同。输入形参为函数的输入参数,输出形参为函数的输出参数。当输出形参多于一个时,则应该用方括号括起来。
例3-14编写函数文件求半径为r的圆的面积和周长。
函数文件如下:
function [s,p]=fcircle(r)
%CIRCLEcalculate the area and perimeter of a circle of radii r
%r圆半径
%s圆面积
%p圆周长
%2004年7月30日编
s=pi*r*r;
p=2*pi*r;
例3-15利用函数文件,实现直角坐标(x,y)与极坐标(ρ,θ)之间的转换。
函数文件tran.m:
function [rho,theta]=tran(x,y)
rho=sqrt(x*x+y*y);
theta=atan(y/x);
调用tran.m的命令文件
x=input('Please input x=:');
y=input('Please input y=:');
[rho,the]=tran(x,y);
rho
the
在MATLAB中,函数可以嵌套调用,即一个函数可以调用别的函数,甚至调用它自身。一个函数调用它自身称为函数的递归调用。
例3-16利用函数的递归调用,求n!。
n!本身就是以递归的形式定义的:
显然,求n!需要求(n-1)!,这时可采用递归调用。递归调用函数文件factor.m如下:
function f=factor(n)
if n<=1
f=1;
else
f=factor(n-1)*n;%递归调用求(n-1)!
end
(2) 函数参数的可调性
在调用函数时,MATLAB用两个永久变量nargin和nargout分别记录调用该函数时的输入实参和输出实参的个数。只要在函数文件中包含这两个变量,就可以准确地知道该函数文件被调用时的输入输出参数个数,从而决定函数如何进行处理。
例3-17nargin用法示例。
函数文件examp.m:
function fout=charray(a,b,c)
if nargin==1
fout=a;
elseif nargin==2
fout=a+b;
elseif nargin==3
fout=(a*b*c)/2;
end
命令文件mydemo.m:
x=[1:3];
y=[1;2;3];
examp(x)
examp(x,y')
examp(x,y,3)
1.8程序举例
例3-19猜数游戏。首先由计算机产生[1,100]之间的随机整数,然后由用户猜测所产生的随机数。根据用户猜测的情况给出不同提示,如猜测的数大于产生的数,则显示“High”,小于则显示“Low”,等于则显示“You won”,同时退出游戏。用户最多可以猜7次。