1° 计算的介绍
数值默认为双精度实数,可用浮点数或科学计数法表示。浮点数表示范围在 10^-308 ~ 10^308
1.1 关系运算
主要对两个运算量大小关系进行比较,输出逻辑值 1 或 0
运算符 | 说明 | 运算符 | 说明 |
---|---|---|---|
< | 小于 | <= | 小于等于 |
> | 大于 | >= | 大于等于 |
== | 等于 | ~= | 不等于 |
A = [1 2 3 4];
b = A > 2
>> b = 0 0 1 1
1.2 逻辑运算
表示运算量的逻辑关系,运算结果为 1 或 0
名称 | 运算符 | 说明 |
---|---|---|
与 | & | 两元素都为真时为真 |
或 | | | 两元素都为假时为假 |
非 | ~ | 元素为假结果为真,元素为真结果为假 |
2° 变量与表达式
2.1 变量
Matlab 不要求对变量进行事先声明,也不用指定变量的类型。不能用 Matlab 中的 20 个关键字对变量命名。
可以用 who
或 whos
查看已定义的变量,clear 变量名
清除变量save fname 变量
将指定变量保存到 fname.mat 中,load faname 变量
可从 fname.mat 中读取该变量。
系统预设变量 pi
inf
NaN
eps
,还有虚部单位i
j
2.2 表达式
表达式是常量、变量、函数和运算符号组合起来有确定值以及类型的算式。
算数、关系、逻辑、赋值表达式比较常见,其他表达式:
- 逗号表达式
a = 3,b =2
- 符号表达式
f = sym('a*x^2 + b*x + c')
- 正则表达式
regexpi(str,pat,'start')
——文本处理、服务器、脚本
Matlab 赋值语句有两种形式:①变量=表达式;②表达式。
其中,表达式是用运算符将有关运算量连接起来的式子,其结果是一个矩阵。
ps:第二种语句形式下,将表达式的值赋给 Matlab 的永久变量 ans。
如果在语句的最后加 ;
,那么将只执行赋值操作,不显示运算结果。在一条语句中,如果表达式太复杂,一行写不下,可以加上 ...
(续行符)并回车键,然后接下去再写。例如:
s = 1-1/2+1/3-1/4+1/5-1/6+1/7-...
- 1/8+1/9-1/10+1/11-1/12;
2.2.1 算数表达式
运算符:+
-
*
/
(右除)\
(左除)^
(乘方)
对于矩阵来说,左除和右除表示两种不同的除数矩阵和被除数矩阵的关系。
2.2.2 关系表达式
运算符:<
<=
>
>=
==
~=
2.2.3 逻辑表达式
运算符:&
|
~
2.2.4 正则表达式
str='ten,&8yn2tin6ui>&ton, t n,-356tpn,t#n,4@).,t@nT&nY';
pat='t.n'; %寻找 t 开始 n 结束的正则表达式
o1=regexpi(str,pat,'start')
2.3 运算符优先级
在一个表达式中,算术运算符优先级最高,其次是关系运算符,最后是逻辑运算符。需要时可以通过 ()
来改变运算顺序,因为括号是第一优先级的。
不推荐写太长的表达式!
3° 数据类型
Matlab 的早期版本只有非常简单的二维数组和字符类型的数据,目前的 Matlab 版本中不仅有多达十几种的基本数据类型,在不同的专业工具箱中还有特殊的数据类型,并且MATLAB还支持面向对象的编程技术,支持自定义数据类型。
常用的数据类型有:
numeric
数值 char
字符 logical
逻辑 cell
元胞 struct
结构体 function handle
函数句柄
3.1 数值型
①整数——带符号、无符号;②浮点数——单精度、双精度。
Matlab 为了提高数值计算的精度,若没有指定数据类型,则所有的数都被看作是双精度的浮点数。使用整型数据或单精度数据可以节约内存空间。基本数值类型如下:
整型数据运算规则:相同整型数据之间的运算,结果为同类型的整数。不同整型数据之间不能进行运算!
复数的输入方式:
z = 3+4i
z = complex(3,4)
3.2 字符串
字符与字符串运算是各种高级语言不可缺少的部分,Matlab 具有强大的字符处理能力。
%字符串必须用单引号括起来
str1 = 'Matrix Laboratory'
%字符串是由多个字符组成的字符行向量
str2 = ['M','a','t','r','i','x']
%字符数组必须是方的,即每行的字符个数必须相等
str3 = ['M','a','t'; 'r','i','x']
%字符串中的每个字符(包括空格)都是字符串的一个元素
str='Matrix';
str(3)
size(str)
%Matlab 中字符是以 ASCII 码存储的,因而区分大小写,可用 double 等函数查看一个字符的 ASCII 码
str='Matrix';
double(str(3));
int16(str);
一般的字符串处理:
- 连接运算
c = [a, ' ', b]
- 求子串
- 删除子串
- 插入子串
- 求字符串长度
- 搜索子串的位置
- 字符的大写转换
- 数值转换为数串
- 数串转换为数值
a = 'This is No.3-15 Example!'
b = a(1:4)
c = a(12:15)
d = a(17:end)
whos
常用字符串操作函数:
数字和字符之间的转换函数:
不同数值之间的转换函数:
3.3 数组
一维数组相当于向量,二维数组相当于矩阵。所以矩阵是数组的子集。
3.1.1 数组的创建
%一维数组的创建
data1 = [pi;log(5);7+6;2^3];
data2 = [pi log(5) 7+6 2^3];
data3 = 2:2:10; %步长生成法
data4 = 2:10;
data5 = linspace(2,10,5); %定数线性采样法
data6 = logspace(1,5,10);
%块操作函数
A=eye(2) %生成单位矩阵
B=ones(2,3) %生成全 1 的矩阵,函数 zeros 生成全 0 矩阵
repmat(A,2,2) %数组块状赋值函数
blkdiag(A,B) %对角块生成函数 blkdiag
C=kron(A,B) %块操作函数 kron
3.1.2 多维数组的创建
在MATLAB中,将三维或者三维以上的数组统称为高维数组。
- 使用下标引用的方法创建三维数组
- 使用低维数组创建高维数组
- 使用函数命令来创建高维数组
3.1.3 下标访问
3.1.4 数组运算与矩阵运算对比
数组运算:无论在数组上施加什么运算,总认为那种运算对被运算数组中的每个元素(Element)平等地实施同样的操作。
指令 | 数组运算含义 | 指令 | 矩阵运算含义 |
---|---|---|---|
A.' | 非共轭转置。相当于conj(A') | A' | 共轭转置 |
A = s | 把标量 s 赋给 A 的每个元素 | ||
s + B | 标量 s 分别与 B 元素之和 | ||
s - B, B - s | 标量 s 分别与 B 的元素之差 | ||
s.*A | 标量 s 分别与 A 的元素之积 | s*A | 标量 s 分别与 A 每个元素之积 |
s./B,B.\s | s分别被B的元素除 | s*inv(B) | B 阵的逆乘 s |
A.^n | A的每个元素自乘n次 | A^n | A 为方阵时,自乘 n 次 |
A.^p | 对A的各元素分别求非整数幂 | A^p | 方阵 A 的非整数乘方 |
p.^A | 以p为底,分别以A的元素为指数求幂值 | p^A | A 阵为方阵时,标量的矩阵乘方 |
A + B | 对应元素相加 | A + B | 矩阵相加 |
A - B | 对应元素相减 | A - B | 矩阵相减 |
A.*B | 对应元素相乘 | A*B | 内维相同矩阵的乘积 |
A./B | A 的元素被 B 的对应元素除 | A/B | A 右除 B |
B.\A | (一定与上相同) | B\A | A 左除 B |
exp(A) | 以自然数 e 为底,分别以 A 的元素为指数,求幂 | expm(A) | A 的矩阵指数函数 |
log(A) | 对 A 的各元素求对数 | logm(A) | A 的矩阵对数函数 |
sqrt(A) | 对 A 的各元素求平方根 | sqrtm(A) | A 的矩阵平方根函数 |
f(A) | 求 A 各个元素的函数值。f(.)表示为上节所 列各函数 | funm(A,’FN’) | 一般函数矩阵 |
A#B | A、B 阵对应元素间的关系运算。#代表关系运算符 | ||
A@B | A、B 阵对应元素间的逻辑运算。#代表逻辑运算符 |
ps:a.\b = b./a
都是 b 的元素被 a 的对应元素除。
数组的维数(Dimension)和 ndims
指令指令 ndims(A)
可直接给出数组 A 的维数。
数组的大小(Size)和 size
指令不管A数组的维数是多少,size(A)
可给出 A 各维的大小,而指令 length(A)
可给出所有维中的最大长度。即 length(A)
等价于 max(size(A))
。
3.4 元胞和结构体
3.4.1 元胞
可以将元胞数组看作一种无所不包的通用矩阵,或者叫作广义矩阵。
创建元胞数组需要使用运算符花括号 {}
A = {zeros(2,2,2) , 'Hello' ; 17.35,1:100}
B = cell(3,2)
元胞数组的访问:
A = {zeros(2,2,2) , 'Hello' ; 17.35,1:10};
D = A{1,2}(4)
E = A{2,2}(5:end)
class(E)
F = A{4}([1 3 5])
whos
元胞数组的扩充:
A = {zeros(2,2,2) , 'Hello' ; 17.35,1:10};
B = cell(2)
B(:,1) = {char('Hello', 'Welcome'); 10:1:5}
C=[A,B]
[A,B;C]
whos
元胞数组操作函数:
函数 | 说明 |
---|---|
cell | 创建空的元胞数组 |
cellfun | 为元胞数组的每个元胞执行指定的函数 |
celldisp | 显示所有元胞的内容 |
cellplot | 利用图形方式显示元胞数组 |
cell2mat | 将元胞数组转变成为普通的矩阵 |
mat2cell | 将数值矩阵转变成为元胞数组 |
num2cell | 将数值数组转变成为元胞数组 |
deal | 将输入参数赋值给输出 |
cell2struct | 将元胞数组转变成为结构 |
struct2cell | 将结构转变成为元胞数组 |
iscell | 判断输入是否为元胞数组 |
3.4.2 结构体
创建结构数组对象可以使用两种方法,一种是直接赋值的方法,另外一种方法是利用 struct 函数创建。
Student.name = 'Way';
Student.age = 26;
Student.grade = uint16(1);
whos
Student
基本语法结构式 struct_name.(expression)
Student= struct('name',{'Deni','Sherry'},'age',{22,24},'grade',{2,3},...
'score',{rand(3)*10,randn(3)*10});
Student
Student(2).score
Student(1).score(1,:)
Student.name
Student.('name')
mean(Student(1).score)
%mean(Student.score)
mean([Student.score])
结构和元胞之间的转换:
S.name = 'Deni';S.ID = 0;
S(2).name = 'Way';S(2).ID = 1;
C = struct2cell(S)
C = squeeze(C)%
fields = {'Name','ID'};
S2 = cell2struct(C',fields,2)
whos
3.5 关系与逻辑运算
在 1.1 和 1.2 中大致介绍完毕