逻辑基础
1.逻辑变量
Logical类型: true(真值); false(假值)
a=true
b=false
2.逻辑判定
数字逻辑:
常用的特殊逻辑:
3.逻辑运算
交叉知识-扩充优先级
优先级 | 符号 |
1(最高) | 括号( ) |
2 | 转置 ’ ;次幂 ^ |
3 | 一元运算符 + - ~ |
4 | 乘除 * / \ |
5 | 加减 + - |
6 | 冒号表达式 : |
7 | 二元比较逻辑 > >= < <= ~= |
8 | 逻辑与 & |
9 | 逻辑或 | |
10 | 标量逻辑与 && |
11(最低) | 标量逻辑或 || |
记不住优先级顺序时,老老实实加括号才是最好的选择
结构基础
1.算法需求
算法五特性
(1)有穷性。有穷性是指算法需在有穷步骤、有穷时间内结束。
(2)确定性。确定性是指每个步骤都有确切的意义,相同的输入有相同的输出。
(3)有效性。有效性是指可通过已实现的运算在有限次完成,或叫可行性。
(4)输入。
(5)输出。
2.分支语句
分支语句的作用:判断当前的情况来决定下一步的工作
一般情形:MATLAB提供了if-else-end结构和switch-case-otherwise结构来实现分支功能。
特殊情形:try-catch结构是分支选择结构的一种特殊形式。如果程序的bugs在try语句块中,那么程序将会执行catch语句块。try-catch语句可以用于捕捉错误。
问:为什么try-catch应用较少?
在当前Matlab的脚本高debug运行模式下,采用dbstop if error等语句更加简洁,当针对特殊异常捕获时才会使用try-catch。
if-else-end
注意elseif不能写为else if,若写为后者,需要补充end与其对应
具体案例:一元二次方程求实数根
a=1;b=2;c=1;
delta=b^2-4*a*c;
if delta>0
x(1)=(-b+sqrt(delta))/2/a;
x(2)=(-b-sqrt(delta))/2/a;
elseif delta ==0
x=(-b+sqrt(delta))/2/a;
else
x=[];
end
switch-case-otherwise
通过switch_expression获取要判断的值,从不同的case中选择满足的值。
otherwise不需要提供判断条件,当其他分支均不满足时被执行。
*Switch不能指定范围
具体案例:一元二次方程求实数根
a=1;b=2;c=1;
delta=b^2-4*a*c;
switch sign(delta)
case 1
x(1)=(-b+sqrt(delta))/2/a;
x(2)=(-b-sqrt(delta))/2/a;
case 0
x=(-b+sqrt(delta))/2/a;
otherwise
x=[];
end
3.循环语句
循环语句的作用:对重复性工作进行执行,并提供起始和结束的标志
MATLAB提供了for结构和while结构来实现分支功能。
-for语句循环的特点是判断条件通常是对循环次数的判断,一般循环次数预先设定好;
-while语句直接将逻辑判断语句作为控制条件
原则上while的适用范围更广一些。但在一般操作中for循环的应用更加广泛。
for循环
index在values中按顺序进行取值,value一般是行向量形式,一般采用冒号表达式进行生成
*当value为矩阵形式,则将矩阵按照列进行切割,每个value取矩阵的一列。
s=10;
H=zeros(s);
for ii=1:s
for jj = 1:s
H(ii,jj) = 1/(ii+jj-1);
end
end
while循环
通过expression来判断下一次循环是否被进行
一般情况下,应在循环结构中对expression进行更新
具体案例:计算10!
n=10;
f=n;
while n>1
n=n-1;
f=f*n;
end
4.组合控制
除了在判断中对代码下一步进行控制,还具有三种特殊控制符
limit = 0.8; s = 0;
while 1
tmp = rand;
if tmp > limit
break
end
s = s + tmp;
end
%死循环
limit = 0.8; s = 0;
while 1
tmp = rand;
if tmp > limit
continue
end
s = s + tmp;
end
*交叉知识-循环体与矩阵
Matlab具有非常优异的矩阵运算优势,能用矩阵运算则用矩阵
1.尽量避免对矩阵元素进行循环遍历操作
2.循环体中的参量应提前预留空间,避免在循环中新建空间
x=sin(0:0.001:1e5);
tic
for ii=2:(length(x)-1)
y(ii-1)=(x(ii-1)+x(ii+1))/2;
end
toc
%时间已过 9.541004 秒。
x=sin(0:0.001:1e5);
tic
y=zeros(1,length(x)-2);
for ii=2:(length(x)-1)
y(ii-1)=(x(ii-1)+x(ii+1))/2;
end
toc
%时间已过 0.695248 秒。
*交叉知识-多线程
自定义函数
1.M-File
尽管完全在MATLAB命令行中进行许多有用的计算,但迟早需要编写M文件。它们是其他编程语言中程序、函数、子程序和过程的等价物。将一系列命令收集到一个M文件中会带来很多可能性,包括
• 通过编辑文件而不是重新键入一长串命令来实现算法,
• 对数值实验进行永久记录,
• 建立日后可重复使用的公用设施,
• 与他人交换M文件。
M-File的两种主要形式
• 脚本:可直接运行、编辑、调试的一组代码
• 函数:进行特定输入/输出的一组代码
2.函数格式
基本格式:
function[输出形参表: output1, ...,outptn] = 函数名(输入形参表: input1, ... , inputn)
函数体代码部分
end
函数需存为m文件,命名默认为函数名。
*不要随意改动文件名字,否则将产生调用问题。
具体案例:获取数列最大值
my_max.m
function [maxval]= my_max(L)
maxval=L(1);
for ii=2:length(L)
if maxval<L(ii)
maxval=L(ii);
end
end
end
如果Matlab有该功能的函数,应避免自己重新实现
3.输入输出
如需要默认输入值,则需要通过输入参量进行控制
nargin : 输入参量的个数
function c = addme(a,b)
switch nargin
case 2
c = a + b;
case 1
c = a + a;
otherwise
c = 0;
end
end
仅输入一个变量,第二个变量默认为1
function c = addme(a,b)
if nargin==1
b=1;
end
c=a+b;
end
代入变量时,排序靠前的参量先被赋值
忽略不想要的输出
~表达式
function [c1,c2] = opme(a,b)
if nargin<2
b=1;
end
c1=a+b;
c2=a+b;
end
为节省空间可以修改为:
通过~表达式可以选择自己需要的输出,节省内存空间
特殊形式
1.函数句柄
采用@来创建函数句柄,从而调用函数或将函数作为变量
fun1=@opme;
[a,b]=fun1(1,1)
a =
0
b =
2
采用@来创建匿名函数,减少M文件的创建
fun2=@(x,y)(x+y);%定义匿名函数
fun2(1,1);%调用匿名函数
3.符号运算式
采用syms构建函数
x1,x2保留符号特性
syms x1 x2
f=x1*x2;
subs(f,[x1,x2],[4,5])
x1,x2不保留符号特性
syms x1 x2
f=x1*x2;
x1=4;x2=5;
subs(f)
eval(f)