浙江大学城市学院实验报告
表3.2
&
逻辑与
|
逻辑或
~
逻辑非
逻辑运算将每个非零元素当作1(真)来处理。同关系运算一样,它也可以作用于格式相同的矩阵,运算结果为由“0”和“1”组成的矩阵。
>> b1=3&0,b2=3|0,b3=~(2>=3) %数值的逻辑运算。
b1 =
0
b2 =
1
b3 =
1
>> b4=[-2 -1 0;1 2 3];b5=[1 3 5;-1 -3 -5];
while循环语句的一般格式为:
while条件
循环体
end
“条件”即执行循环的条件,用来控制循环的次数,它可以是关系表达式或逻辑表达式。当条件成立(即为1)时,循环体被执行,直到条件不成立(即为0)时,结束循环。
我们利用while循环来寻找阶乘小于100万的最大的自然数。
>> m=1;
>> while prod(1:m)<1000000 %prod为向量的连乘函数。
到目前为止,我们仍然一直在命令窗口逐行输入数据和命令来实现计算等功能。这种方法对于较为简单的问题还可以接受,一旦问题较为复杂,这种方法就显得相当麻烦,这时MATLAB提供的以m为扩展名的M文件的作用就突显出来了。M文件有两种类型:文本M文件和函数M文件。
建立M文件可以在MATLAB的主窗口的File下拉式菜单中选择New,再选择M-file,此时MATLA口的File下拉式菜单中选择Save,将弹出保存对话框,选择文件的保存位置并键入文件名称(需遵循变量的命名规则)和“.m”,单击保存按钮即完成M文件的建立。已经建立好的M文件可以随时打开、编辑、修改,方法同Windows操作系统。
>> disp(d) %显示各阶乘。
1 2 6 24 120
前述for语句一般格式中的“冒号表达式”部分也可以是任意的向量或矩阵的变量名,此时,循环变量依次取向量的值或按矩阵的列依次取值。
>> f1=[1 3 5];f2=[1 3 5;4 6 8]; i=1;j=1;
>> for g=f1
f3(i)=g;i=i+1; %取出f1的各分量的值。
格式3:if条件1
语句组1
elseif条件2
语句组2
……
elseif条件n
语句组n
else
语句组n+1
end
当条件1成立时,执行语句组1,执行完成后,执行end的后续语句;当条件1不成立时,判断条件2,若其成立,执行语句组2,执行完成后,执行end的后续语句;依次类推,若所有条件均不成立,则执行语句组n+1,执行完成后,执行end的后续语句。
m=m+1;
end
>> m=m-1 %结束循环的条件为阶乘大于100万,故最终的结果需减1。
m =
9
选择结构的if语句的格式主要有以下三种:
格式1:if条件
语句组
end
当条件成立时,执行语句组,否则执行end的后续语句。
格式2:if条件
语句组1
else
语句组2
end
当条件成立时,执行语句组1,否则执行语句组2。执行完成之后,执行end的后续语句。
for循环语句的一般格式为:
for循环变量=冒号表达式
循环体
end
其中的循环体可以是一条语句或命令,也可以是由逗号、分号隔开的若干语句或命令。冒号表达式用来控制循环的次数,对于由冒号表达式确定的每一个循环变量的值,循环体中的所有语句都被重复执行。
我们利用for循环来计算自然数1~5的阶乘。
>> d=zeros(1,5); %开辟存放各阶乘的地址, MATLAB可动态调节矩阵的格式,故只使用后面的语句结果也是将各阶乘存放到矩阵d中,但预先开辟空间可节约运行时间。
>> e=1; %对乘积因子变量e赋初值。
>> for i=1:5 %循环变量i从1一直到5,步长为1。
d(i)=e*i; %此for循环的循环体包含两个语句,此句作用是求i的阶乘并存放在d(i)处且结果不显示(不显示可节约运行时间)。
e=d(i); %改变e的值且结果不显示。
end %结束for循环。
>> c=[1 2 3;0 1 0];
>> c1=any(c),c2=all(c)
c1 =
1 1 1%矩阵c的每一列中都有非零元素。
c2 =
0 1 0%矩阵c中只有第二列中所有元素非零。
MATLAB程序的控制结构有顺序结构、循环结构和选择结构三种。顺序结构较为简单,即根据语句的书写顺序,从上到下按行执行,执行完所有语句后结束程序运行。我们这里主要介绍循环结构的控制流语句for、while和选择结构的控制流语句if、switch,这四个语句均以end结束。
函数M文件的第一行有特殊的格式,必须以function开头。函数M文件的一般格式为:
function [输出参数表]=函数名(形式参数)
语句组
end
这里的输出参数表可以是一个变量,也可以是多个变量,他们表示要计算的量。如果是一个参数,双括号可以去掉;如果是多个变量,两两之间用逗号隔开。这里的函数名必须与该文件的文件名一致,这样才能保证成功调用。形式参数是一组形式变量,本身没有任何意义,只有在调用时赋予它们实际值才有意义。
>> a1=5>8
a1 =
0
>> a2=[1 2 3;4 5 6];a3=[6 5 4;3 2 1];
>> a4=a2<=a3 %两矩阵进行关系运算。
a4 =
1 1 1
0 0 0
>> a5=a2>=3 %矩阵与标量间的关系运算是指矩阵的每个元素与该标量进行关系运算。
a5 =
0 0 1
1 1 1
MATLAB提供了3各逻辑运算符,如下表3.2所示:
else
while i<n-1
f(i+2)=f(i)+f(i+1);
i=i+1;
end
end
s=sum(f);
函数M文件的调用格式为:[输出参数表]=函数名(实际参数)。若我们想知道前10个Fibonnaci数及这10个之和,只需在MATLAB的命令窗口中键入:
>> [fib,fibs]=Fibon(10) %返回值分别赋予fib和fibs
else
while i<n-1
f(i+2)=f(i)+f(i+1);
i=i+1;
end
end
f
这里要注意的是,文本M文件中所定义和使用的变量均为全局变量,如本例中的f、i及n,它们不仅在本程序的运行过程中有效,程序运行完成之后仍然有效。我们在编辑程序时,要尽量避免使用全局变量。
运行文本M文件,只需在MATLAB的命令窗口中直接键入该文本M文件的文件名即可。
>> b6=(b4>-2)&(b5<=3),b7=~(b5>=b4|b4<0) %矩阵间的逻辑运算。
b6 =
0 1 0
1 1 1
b7 =
0 0 0
1 1 1
除上述的关系运算符和逻辑运算符之外,MATLAB还提供了大量的关系和逻辑函数,最常见的有函数any(A)、all(A)以及异或运算函数xor(A,B)。若矩阵A的某列中有非零元素,则any(A)的关于此列的值为1,否则为0。若矩阵A的某列中所有元素非零,all(A)的关于此列的值为1,否则为0。
switch表达式
case值1
语句组1
case值2
语句组2
……
case值n
语句组n
otherwise
语句组n+1
end
当表达式的值为值1时,执行语句组1,执行完成后,执行end的后续语句;当表达式的值为值2时,执行语句组2,执行完成后,执行end的后续语句;依次类推,若以上均不满足,执行语句组n+1,执行完成后,执行end的后续语句。
我们编写一个命名为Fibon.m的函数M文件,它的功能是产生前n个Fibonnaci数,并计算这n个数之和。
function [f,s]=fibon(n) %返回两个量f、s,n为形式参数。
f=[1 1];i=1;
if n==1
f(2)=[ ];
elseif n==2 %如果n为2,不执行任何语句。
fib =
1 1 2 3 5 8 13 21 34 55
我们可以利用上述3种格式的if语句自定义符号函数 。若用格式1,需分别调用3次;若用格式2,则需使用嵌套;下面是用格式3书写的程序。
>> if x>0
y=1;
elseif x<0
y=-1;
else
y=0;
end
无论是for循环还是while循环,break语句可以强行退出循环,立即执行此循环end的后续语句。一般我们用if语句与break语句组合使用来中断循环。
>> n=10;Fibo %产生前10个Fibonnaci数;文件中未指定n的大小,需事先指定。
f =
1 1 2 3 5 8 13 21 34 55
函数M文件是另一类M文件。MATLAB所提供的绝大多数功能函数都是由函数M文件实现的,可见函数M文件的重要性。我们可以根据需要建立自己的函数M文件,它能够像系统中的功能函数一样方便地调用,从而极大地扩展了MATLAB的功能。
文本M文件就是命令行的简单叠加,调用文本M文件时,MATLAB会自动按顺序执行文件中的命令行。以下是我们自己编写的命名为Fibo.m的一个文本M文件,它的功能是产生前n个Fibonnaci数。