当条件成立时,则执行语句组,执行完之后继续执行 if 语句后面的语句,若条件不成立,则直接执行if语句后面的语句。例如,当 x 是整数矩阵时,输出 x 的值,语句如下:
iffix(x)==xdisp(x);
end
(2) 双分支 if 语句。
其语句格式如下:
if 条件语句组 1else语句组 2
end
当条件成立时,执行语句组 1,否则执行语句组 2,语句组 1 或语句组 2 执行后,再执行 if 语句后面的语句。
例如,我们计算分段函数的值。 y = { c o s ( x + 1 ) + x 2 + 1 , x = 10 x x + x , x ≠ 10 y=\left\{\begin{matrix}cos\left ( x+1 \right )+\sqrt{x^{2}+1},x=10 \\x\sqrt{x+\sqrt{x} } ,x\ne 10 \end{matrix}\right. y={cos(x+1)+x2+1,x=10xx+x,x=10
这是一个具有两个分支的分段函数,为了求函数值,可以采用双分支结构来实现。程序如下:
x=input('请输入 x 得到值:');if x==10y=cos(x+1)+sqrt(x*x+1);elsey=x*sqrt(x+sqrt(x));
end
y
可以不用第一个 if 语句,而直接求函数值即可,改用以下程序实现。
x=input('请输入 x 得到值:');
y=cos(x+1)+sqrt(x*x+1);if x=~10y=x*sqrt(x+sqrt(x));
end
y
(3) 多分支 if 语句。
其语句格式如下:
if 条件 1语句组 1
elseif 条件 2语句组 2…
elseif 条件 m语句组 m
else 语句组 n
end
对于 for 语句,首先计算 3 个冒号表达式,形成一个行向量,再将向量中的元素逐个赋给循环变量,每次赋值后都执行一次循环体语句,当向量的元素都被使用完时,结束 for 语句的执行,而继续执行 for 语句后面的语句。
关于 for 语句的执行,还需要注意以下几点。
(1) for 语句针对向量的每一个元素执行一次循环体,循环的次数就是向量中元素的个数,也可以针对任意向量。
(2) 可以在 for 循环体中修改循环变量的值,但当程序执行流程再次回到循环开始时,就会自动被设成向量的下一个元素。
(3) for 语句中的 3 个表达式只在循环开始时计算一次, 也就是说,向量元素一旦确定将不会再改变。如果在表达式中含有变量,即便在循环体中改变变量的值,向量的元素也不改变。
(4) 推出循环后,循环变量的值就是向量中最后的元素值。
(5) 当向量为空时,循环体一次也不执行。
例如,一个 3 位整数各位数字的立方和等于该数本身则称该数为水仙花数。输出全部水仙花数。
首先考虑如何判断水仙花数,关键的一步是先分别求 3 位整数的个位、十位、百位数字,再根据条件判断该数是否为水仙花数。然后利用 for 语句穷举全部 3 位整数。程序如下:
shu=[]%用于存放结果,先赋空值
for m=100:1:999m1=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*m3shu=[shu,m];%存入结构end
end
disp(shu)
程序运行结果如下:
shu =[]153370371407
例如,已知 y = 1 + 1 2 2 + 1 3 2 + … + 1 n 2 y=1+\frac{1}{2^{2} } +\frac{1}{3^{2} }+…+\frac{1}{n^{2} } y=1+221+321+…+n21,当 n = 100 n=100 n=100 时,求 y y y 的值。
这是求 n n n 个数之和的累加问题,可用以下递推式来描述: y i = y i − 1 + f i y_{i} =y_{i-1}+f_{i} yi=yi−1+fi
其中, y 0 = 0 y_{0}=0 y0=0,即第 i i i 此的累加和 y y y 等于第 i − 1 i-1 i−1 次的累加和加上本次的累加项 f f f,可用以下赋值语句来实现。 y = y + f y=y+f y=y+f
其中累加项 f f f 可用以下赋值语句来实现。 f = 1 / ( i ∗ i ) f=1/(i*i) f=1/(i∗i)
整体程序如下:
y=0;
n=100;for i=1:1:ny=y+1/(i*i);
end
y
程序运行结果如下:
y =1.6350
例如,设 f ( x ) = e − 0.5 x sin ( x + π 6 ) f(x)=e^{-0.5x}\sin(x+\frac{\pi }{6} ) f(x)=e−0.5xsin(x+6π),求 s = ∫ 0 3 π f ( x ) d x s=\int_{0}^{3\pi } f(x)dx s=∫03πf(x)dx 的值。
求函数 f ( x ) f(x) f(x) 在 [ a , b ] [a,b] [a,b] 上的定积分,其几何意义就是求曲线 y = f ( x ) y=f(x) y=f(x) 与直线 x = a x=a x=a, x = b x=b x=b, y = 0 y=0 y=0 所围成的曲边梯形的面积。
为了求得曲边梯形面积,先将积分区间 [ a , b ] [a,b] [a,b] 分成 n n n 等份,每个区间的宽度为 h = ( b − a ) / n h=(b-a)/n h=(b−a)/n,对应地将曲边梯形分成 n n n 等份,每个小部分即是一个小曲边梯形。近似求出每个小曲边梯形面积,然后将 n n n 个小曲边梯形的面积加起来,就得到总面积,即定积分的近似值。程序如下:
a=0;
b=3*pi;
n=1000;
h=(b-a)/n;
x=a;
s=0;
f0=exp(-0.5*x)*sin(x+pi/6);for i=1:nx=x+h;%下一个 x 坐标f1=exp(-0.5*x)*sin(x+pi/6);%求新的函数值s=s+(f0+f1)*h/2;%求小梯形面积并累加f0=f1;%更新函数值
end
s
a=0;
b=3*pi;
n=1000;
h=(b-a)/n;
x=a:h:b;%生成自变量向量 x
f=exp(-0.5*x).*sin(x+pi/6);%求函数值向量 f
for i=1:ns(i)=(f(i)+f(i+1))*h/2;%求各个小梯形面积,组成面积向量 f
end
s=sum(s)%求面积向量 s 元素之和
程序中 x、f、 s 均为向量,f 的元素为各个 x 点的函数值,s 的元素分别为 n 个梯形的面积,s 各元素之和即定积分近似值。事实上,MATLAB 提供了有关数值积分的标准函数,实际应用中可直接调用这些函数求数值积分。
2. while 语句
while 语句就是通过判断循环条件是否满足来决定是否继续循环的一种循环控制语句,也称为条件循环语句。它的特点是先判断循环条件,条件满足时执行循环。
while 语句的一般格式如下:
while 条件循环体语句
end
其执行过程为,若条件成立,则执行循环体语句,执行后再判断条件是否成立,如果不成立则跳出循环。
例如,从键盘中输入若干个数,当输入 0 时结束输入,求这些数的平均值和它们之和。
这是一个典型的条件循环问题,用 while 语句实现。程序如下:
sum=0;
n=0;
x=input('Enter a number(end in 0):');while x~=0sum=sum+x;n=n+1;x=input('Enter a number(end in 0):');
end
if n>0summean=sum/n
end
运行结果如下:
Enter a number(end in 0):67
Enter a number(end in 0):89
Enter a number(end in 0):93
Enter a number(end in 0):70
Enter a number(end in 0):0sum =319mean =79.7500
例如,根据矩阵指数的幂级数展开式求矩阵指数。 e X = I + X + X 2 2 ! + X 3 3 ! + … + X n n ! + … e^{X}=I+X+\frac{X^{2}}{2!}+\frac{X^{3}}{3!}+…+\frac{X^{n}}{n!}+… eX=I+X+2!X2+3!X3+…+n!Xn+…
设 X X X 是给定的矩阵, E E E 是矩阵指数函数值, F F F 是展开式的项, n n n 是项数,循环一直进行到 F F F 很小,以至于 F F F 值加在 E E E 上对 E E E 的值影响不大时为止。
为了判断 F F F 是否很小,可利用求矩阵范数的函数 norm(F,1) 来计算。所以当 norm(F,1)=0 时,认为 F F F 很小,应退出循环的执行。程序如下:
X=input('Enter X:');
E=zeros(size(X));%生成与 X 同样大小的零矩阵
F=eye(size(X));%生成与 X 同样大小的单位矩阵
n=1;whilenorm(F,1)>0E=E+F;%实现累加F=F*X/n;%求累加项n=n+1;
end
E
expm(X)%调用 MATLAB 矩阵指数函数求矩阵指数
运行结果如下:
Enter X:[0.5,2,0;1,-1,-0.5;0.9,1,0.75]E =2.61262.0579-0.63760.74200.7504-0.59422.56782.33591.5549ans =2.61262.0579-0.63760.74200.7504-0.59422.56782.33591.5549
运行结果表明,程序运行结果与 MATLAB 矩阵指数函数 expm(X) 的结果一致。
3. break 语句和 continue 语句
与循环结构相关的语句还有 break 语句和 continue 语句,它们一般与 if 语句配合使用。
这道题如果用暴力法几乎是不可能解出来的,因为情况太复杂了,但是一旦用上递归回溯就会轻松很多,先上代码:
class Solution {List<List<Integer>> result new ArrayList<List<Integer>>();List<Integ…
循环神经网络的简洁实现 如何使用深度学习框架的高级API提供的函数更有效地实现相同的语言模型。 我们仍然从读取时光机器数据集开始。 import torch
from torch import nn
from torch.nn import functional as F
from d2l import torch as d2lbatch_size, num_steps 32, 35
t…