MATLAB学习记录
注:这篇文章主要是我学习基础语法时的一些零散记录。
MATLAB数值数据
数值数据类型
整型
无/有 符号 8/16/32/64 位整数
数据类型转换函数
1 | >> x = uint8(129) |
浮点型
单精度:single 函数
双精度:double 函数
数值数据默认是双精度型。
1 | >> class(4) |
复型
实部和虚部默认双精度型。虚数单位用 i 或 j 来表示。
1 | 6+5i 和 6+5j 表示的是一样的 |
real 函数求实部,imag 函数求虚部。
数值数据的输出格式
format 命令:>> format long(转换为 long 型输出)
转换回默认类型 short:>> format
format 命令只影响数据输出格式。
常用数学函数
abs 函数可以求实数的绝对值、复数的模、字符串的ASCII码值。
B = rem(A, 10) 是对 A 的每一个元素模10取余,得到一个布尔矩阵。
power(x, 2) 等价于 x^2。
取整函数:
fix:向0取整
floor:向下取整
ceil:向上取整
round:四舍五入
1 | >> x = sin(pi/2) # 弧度制 |
1 | >> x = sqrt(7)-2i # 复数 |
1 | >> x = 1 : 100 |
变量
变量名以字母开头,只能由字母、数字和下划线组成,最多63个字符。变量名区分字母的大小写。标准函数名以及命令名必须用小写字母。
预定义变量
ans 是默认赋值变量
i 和 j 代表虚数单位
pi 代表圆周率
NaN 代表非数
变量管理
用 who 和 whos 查看变量。
用于保存MATLAB工作区变量的文件叫内存变量文件,扩展名为.mat,也叫 MAT 文件。
save 命令:创建内存变量文件
load 命令:装入内存变量文件
1 | >> save mydata a x # mydata.mat |
MATLAB矩阵
矩阵的建立
1)直接输入法
将矩阵元素用 [ ] 括起来,按矩阵行的顺序输入各元素,同一行元素用逗号或空格分隔,不同行用分号分隔。
1 | >> A = [1, 2, 3; 4, 5, 6] |
2)利用已建好的矩阵建立更大的矩阵
1 | >> A = [1,2,3;4,5,6;7,8,9] |
还可以用实部矩阵和虚部矩阵构成复数矩阵
1 | >> B = [1,2,3;4,5,6] |
冒号表达式
1 | e1 : e2 : e3 |
e1 为初始值,e2 为步长,e3 为终止值。
1 | >> t = 0 : 1 : 5 |
e2 可以省略,默认为 1.
linspace函数
1 | linspace(a, b, n) |
a 为第一个元素,b 为最后一个元素,n 为元素总数。
1 | >> x = linspace(0, pi, 6) |
结构矩阵和单元矩阵
结构矩阵
格式为:结构矩阵元素 . 成员名 = 表达式
1 | >> a(1).x1 = 10; a(1).x2 = 'A'; a(1).x3 = [1, 2, 3]; |
单元矩阵
和一般矩阵相似,但是要用 { } 括起来。
1 | >> b = {10,'A',[1,2,3]; 16,'K',[9,2,7]} # b是 2×3 cell数组 |
矩阵元素的引用
通过下标引用
1 | >> A(4, 5) = 10 # 矩阵A的第4行第5列元素赋值为10 |
1 | >> A = [1,2,3;4,5,6] # A是2行3列 |
通过序号引用
在MATLAB中,矩阵元素按列存储。矩阵元素的序号就是其在内存中的排列顺序。
1 | >> A = [1,2,3;4,5,6] |
序号与下标是一一对应的,m n 矩阵 A 的元素 A( i, j ) 的序号为 ( j - 1 ) m + i 。
矩阵元素的序号与下标可以通过 sub2ind 和 ind2sub 函数实现相互转换。
sub2ind
1 | D = sub2ind(S, I, J) 下标转序号 |
S 是行数和列数组成的向量,通常用 size(A) 获取。I 是转换矩阵元素的行下标,J 是列下标。如果 I 和 J 是矩阵,则表示要将多个元素的行列下标转换为序号。
1 | >> A = [1:3;4:6] |
size(A) 得到的是向量 [2, 3] 。然后依次得到:
行下标为 1,列下标为 1 的元素的序号是 1;
行下标为 2,列下标为 1 的元素的序号是 2;
行下标为 2,列下标为 3 的元素的序号是 6;
行下标为 2,列下标为 2 的元素的序号是 4。
ind2sub
1 | [I, J] = ind2sub(S, D) 序号转下标 |
D 是序号。
1 | >> [I, J] = ind2sub([3,3], [1,3,5]) |
利用冒号表达式获得子矩阵
1 | A(i, :) 第i行的全部元素 |
end运算符:表示某一维的末尾元素下标。(注意是某一维,可以是行或列)
1 | >> A(end, :) # 最后一行 |
删除矩阵中的元素
利用空矩阵删除矩阵的元素
空矩阵是指没有任何元素的矩阵。
1 | >> x = [] |
1 | >> A = [1,2,3,0,0;7,0,9,2,6;1,4,-1,1,8] |
改变矩阵的形状
reshape(A, m, n):在矩阵总元素保持不变的前提下,将矩阵 A 重新排成 m * n 的二维矩阵。
reshape 函数只改变原矩阵的行数和列数,但并不改变原矩阵元素个数及其存储顺序。
A(:) 是将 A 的每一列元素堆叠起来,成为一个列向量。
1 | >> A = [1,2,3;4,5,6] |
所以这里 A(:) 等价于 reshape(A, 6, 1)。
MATLAB基本运算
算术运算
非奇异矩阵是行列式不为 0 的矩阵,也就是可逆矩阵。n 阶方阵 A 是非奇异方阵的充要条件是 A 为可逆矩阵,即A的行列式不为零。矩阵(方阵)A可逆与矩阵A非奇异是等价的概念。
除法运算:
在MATLAB中,有两种矩阵除法运算:右除/和左除\。
如果 A 矩阵是非奇异方阵,则 B/A等效于B inv(A),A\B 等效于 inv(A) B。其中 inv(A) 是 A 的逆矩阵。
乘方运算:^
点运算:.*、./、. 和 .^。
两矩阵进行点运算是指它们的对应元素进行运算,所以两矩阵必须同型。
A . B 和 A B 是不一样的。前者是 A 中每个元素与 B 中对应位置的元素相乘,得到与 A 、B 都同型的矩阵。而 A * B 就是普通的矩阵乘法。
例如,当 x = 1, 4, 7 时,分别求 y = sinxcosx 的值:
1 | >> x = 1:3:7 |
关系运算
关系运算符:
1 | < <= > >= == ~= |
当参与比较的是两个同型的矩阵时,是对应位置的元素按照标量关系运算规则逐个进行,最后得到的结果是一个与原矩阵同型的矩阵,它的元素由 0 / 1 组成。
当参与比较的是一个标量和一个矩阵时,是这个标量与矩阵中的每一个元素进行比较,最后得到的结果是一个与原矩阵同型的矩阵,它的元素由 0 / 1 组成。
逻辑运算符:
1 | &(与) |(或) ~(非) |
在算术运算、关系运算与逻辑运算中,算术运算的优先级最高,逻辑运算的优先级最低,但非(~)是单目运算符,优先级高于双目运算符。
例如判断水仙花数(一个三位数,其三位上的数字的立方之和等于这个数本身):
1 | m = 100 : 999; |
1 | >> k # 序号 |
字符串处理
在MATLAB中,字符串是用单引号括起来的字符序列。
1 | >> s = 'preccrep workstation' |
若字符串中的字符含有单引号,则该字符要用两个单引号来表示。
1 | >> 'I''m a hacker.' |
还可建立多行字符串,形成字符串矩阵:
1 | >> ch = ['abcdef'; '123456'] |
例如:建立一个字符串向量,然后做如下处理:
- 取第1~5个字符作为子字符串;
- 将字符串倒序排列;
- 将字符串中的小写字母全部变为大写;
- 统计字符串中的小写字母数。
1 | >> ch = 'ABc123dhUn' |
字符串的执行
eval(s) 是将字符串 s 当作命令执行,也就是用来执行一个字符串表达式,并返回表达式的值。
1 | t = pi; |
1 | >> r |
字符串与数值之间的转换
abs 和 double 都可以用来获取字符串矩阵所对应的 ASCII 码数值矩阵。
char 函数可以把 ACSII 码矩阵转换为字符串矩阵。
1 | >> s1 = 'MATLAB' |
字符串的比较
两种方法:利用关系运算符比较和字符串比较函数。
关系运算符比较:两个字符串长度相等时,每个字符逐个比较,返回结果是一个数值向量,其元素为0/1。
字符串比较函数:用来判断字符串是否相等。
- strcmp() 函数的基本功能是比较两个字符串是否相等,相等返回 1,否则返回 0。其基本用法是:
1 | ans = strcmp(s1, s2) |
但是,如果我们要查找字符串数组中等于某字符串的索引时,该如果操作?strcmp() 函数也提供了这个功能,用法相同,其中,s1是字符串数组,s2是字符串,返回值为逻辑类型,大小与字符串数组s1相同。
- strncmp(s1, s2, n) 比较前 n 个字符。
- strcmpi(s1, s2) 在忽略字母大小写的情况下,比较两字符串是否相等。
- strncmpi(s1, s2, n) 同理。
字符串的查找与替换
findstr(s1, s2) 返回短字符串在长字符串中的开始位置。
strrep(s1, s2, s3) 将字符串 s1 中的所有子串 s2 替换为字符串 s3。
strfind() 用于查找字符串数组中包含某字符串的记录:
1 | k = strfind(str, pattern) |
输出结果k表示pattern在str中出现的位置,若不出现,则返回[]。比如:
1 | S = ‘Find the starting indices of the pattern string’; |
本文作者 : preccrep
原文链接 : https://preccrep.github.io/2020/07/14/MATLAB%E5%AD%A6%E4%B9%A0%E8%AE%B0%E5%BD%95/
版权声明 : 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!