Matlab基础语法(下)
一、逻辑基础
(一)逻辑运算符
MATLAB 推荐大家直接使用运算符进行计算,因此&、和~这三个符号的功能大家要牢记。
以"&"为例:
- 针对矩阵运算时:"逻辑与&"是对A和B进行计算的,计算时会比较A和 B对应位置的元素。需要符合算术运算中介绍的五种兼容式即可。
- "逻辑与&"不仅可以作用在逻辑值0和1上,还可以用于普通的数值上,这时候,MATLAB 会将非零数值视为逻辑1,将数值零视为逻辑0进行运算。
- "逻辑与&"也可以进行连续运算,例如1&2&3。
- 为避免运算优先级的问题,直接使用小括号来指定计算顺序。
matlab
A = randi([-3,3],2,4)
B = randi([-3,3],1,4)
A & B
A | B
~A
xor(3,4) % 亦或 相当于 xor(1,1)
xor(A,B)
另:
- 支持连续运算
matlab
A = randi([-3,3],2,4)
B = randi([-3,3],1,4)
C = randi([-3,3],1,4)
D = A & B & C
- 关系运算符 的优先级高于 逻辑运算符
matlab
3>4 & 2>-1 % 相当于 0 & 1
- 辨析:&&和|| vs &和|
(1)&&和|| 只能 对标量(只有一个元素) 进行逻辑运算,不能 对有多个元素的向量或者矩阵 进行运算,而&和|可以
(2)&&和||有短路 功能,可以提高运行效率
(二)all、any、find函数
- all(A,dim) 与 & 类似
matlab
B = randi([1,100],2,5)
B(3) = 0 % 线性索引改值
all(B,1)
all(B,2)
- any(A,dim) 与 | 类似
matlab
B = randi([1,100],2,5)
B(3) = 0 % 线性索引改值
any(B,1)
any(B,2)
- find(X,n,direction)
matlab
A = randi([0,2],2,3)
ind1 = find(A) %返回其中所有 非0元素 的 线性索引
ind2 = find(A,2) %返回其中 前两个非0元素 的 线性索引
ind3 = find(A,2,"last") %返回其中 后两个非0元素 的 线性索引
[row,col] = find(A) %按行列分开 生成 两个向量
[row,col,v] = find(A) % 多生成了一个A中非0元素的列向量
(三)练习
这里以5个同学为例
matlab
score = randi([50,100],5,3)
% 先将分数矩阵转化为逻辑矩阵
any(score<60,2) % 关注同学 --> 生成列向量
all(score>=60,1) % 关注科目 --> 生成行向量
这里也以5个同学为例
matlab
score = randi([50,100],5,3)
find(sum(score < 60,2) == 2)
find(sum(score,2) > 260)
二、结构基础
(一)条件结构
(1)if-elseif-else-end
matlab
if [1,2;0,2] % 矩阵中的元素都非 0,表达式才会被当所逻辑值 1
res = 0;
else
res = 10;
end
res
matlab
% 若想要至少有一个元素非 0 就执行 if 语句
A = [1,2;0,2]
A(:)
% A(:) 先用线性索引把 A 拉成一个列向量,不能直接 any(A),这样生成的是向量
if any(A(:))
res = 0;
else
res = 10;
end
res
matlab
score = 87;
if (score >= 90) && (score <= 100)
res = 1;
elseif (score >= 80) && (score < 90) % elseif之间没有空格
res = 2;
elseif (score >= 60) && (score < 80)
res = 3;
elseif (score >= 0) && (score < 60)
res = 4;
else
res = 0;
end % 不要忘了写!
res
matlab
% 找最大值
a = 10;
b = 20;
c = 15;
if a > b
if a > c
max = a;
else
max = c;
end
else
if b > c
max = b;
else
max = c;
end
end
max
(2)switch-case-otherwise-end
matlab
% 注:开关表达式的计算结果必须是一个 数值标量或者是一个字符向量/字符串,不能是向量或矩阵
season = randi([1,4])
switch season
case 1
disp("春季");
case 2
disp("夏季");
case 3
disp("秋季");
otherwise
disp("冬季"); % 加不加分号不影响输出结果
end
% 或
if season == 1
disp("春季");
elseif season == 2
disp("夏季");
elseif season == 3
disp("秋季");
else
disp("冬季");
end
(二)循环结构
(1)for-end
循环变量 :用于迭代的变量名,它会在每次循环迭代中从向量或矩阵中取出列
的值。数值向量或者矩阵则表示了循环变量可以取值的范围,一旦循环变量遍历完数值向量或者矩阵中的所有值,循环就会结束
matlab
% for后跟的可以是一个向量,也可以是一个矩阵
A = randi([-3,3],2,3)
for i = A % 每次都会取出一 列 的值
i
end
matlab
x = 1:6
res_sum = 0;
for i = x
res_sum = res_sum + i;
end
res_sum
matlab
leap_year_num = 0;
for i = 1 : 9999
if ((mod(i,4) == 0) && (mod(i,100) ~= 0)) || (mod(i,400) == 0)
leap_year_num = leap_year_num + 1;
end
end
leap_year_num
(2)while-end
matlab
f(1) = 1;
f(2) = 1;
n = 2;
while f(n) <= 99999
n = n + 1;
f(n) = f(n-1) + f(n-2);
end
n
f(n)
- 一个无限循环,在命令行窗口中按下快捷键 Ctrl + C来中断程序的运行。
matlab
while 1
disp("死循环");
end
- while 后面表达式的计算结果不一定非得是逻辑值1或0。如果表达式的计算结果是一个数值常数,则只有当这个常数为非零值时循环才会进行
matlab
i = 5;
while i
i;
i = i - 1;
end
i
(3)break、continue
matlab
for i = 1:10
if mod(i,2) == 0
continue;
end
i
end
matlab
n = 9;
is_prime = 1;
for i = 2:n-1
if mod(n,i) == 0
is_prime = 0;
break;
end
end
is_prime
(三)小结 + 练习
matlab
a = 6;
b = 10;
eps = 1e-8; %误差阈值
while 1
c = (a+b)/2;
fc = c^3 - 8*c^2 +c - 5;
if abs(fc)<eps
break;
end
fa = a^3 - 8*a^2 +a - 5;
if fa * fc < 0
b = c;
else
a = c;
end
end
x0 = c;
x0
三、函数基础
(一)自定义函数
(1)m文件定义函数
无需关注具体的实现过程,需要编写额外的.m文件 ,定义完的函数保存为同函数名的m文件,放置在Matlab当前路径下
- 函数的基本结构(end可以省略)
- 函数的调用
matlab
% code1.m 文件中
X = 1:20;
[max,min] = max_min__values(X)
matlab
% max_min__values.m文件中
function[max,min] = max_min_values(X)
max = subfun1(X);
min = subfun2(X);
function r = subfun1(X)
x1 = sort(X,'descend');
r = x1(1);
end
function r = subfun2(X)
x1 = sort(X);
r = x1(1);
end
end
(2)匿名函数
matlab
f1 = @(x,y)x.^2 + y.^2;
f1(2,3)
x = 1:5;
y = 0.1:0.1:0.5; %从 0.1,间隔 0.1,到 0.5
f1(x,y)
%双重匿名函数
f2 = @(a,b)@(x)a*x+b; % 外层变量:a,b 内层变量:x
f2(2,3) % 输入两个变量,返回一个单变量函数
matlab
f = @(a)@(x)exp(x)+x^a+x^(sqrt(x))-100; % 根据 a 的函数,获得 x 的函数
A = 0:0.1:2;
% fzero(fun,x0) x0:预测初始值
x = @(a)fzero(f(a),4); % 将 x 变为 a 的函数
X = @(A)arrayfun(@(a)x(a),A); % 将函数应用于每个数组元素
Y = X(A)
% 相当于 Solution = @(A)(@(a)fzero(f(a),4),A)
(二)特殊函数
贝塞尔函数、beta函数、gamma函数......
有需求时去MATLAB帮助中心查看
(三)常用函数
(1)数值运算、三角函数
matlab
sqrt(1:9)
format long g % 取消掉科学计数法
sqrt(1:9)
sqrt(-4)
format short
exp(1:9)
(2)isempty函数
matlab
% 法一:
A = [1:9];
x = 10;
% A == x 元素全为 0 的逻辑向量
~isempty(find(A == x))
% 法二:
A = [1:9];
x = 10;
ismember(x,A)
% 推广:
A = [1:9];
x = 5:10;
ismember(x,A) %找 x 是否在 A 中存在
(3)meshgrid函数
matlab
% 基于向量 x 和 y 中包含的坐标来 返回 二维网络坐标
x = 0:4;
y = 0:3;
[X,Y] = meshgrid(x,y)
% 若写成[X,Y] = meshgrid(x),相当于 [X,Y] = meshgrid(x,x)
Z = X.^2 + Y.^2
(4)rng函数
matlab
% 设置随机数种子,这样能生成可重复的随机数
seed = 3;
rng(seed);
randi(10,3,3)
rng('shuffle'); %根据当前的时间来设置随机数种子
完