MATLAB学习记录

发布 : 2020-07-14 分类 : 笔记 浏览 :

注:这篇文章主要是我学习基础语法时的一些零散记录。

MATLAB数值数据

数值数据类型

整型

无/有 符号 8/16/32/64 位整数

数据类型转换函数

1
2
3
4
5
6
>> x = uint8(129)
129
>> x = int8(129) # 因为int最大是127,129>127,所以返回最大值
127
>> x = int8(-129) # int最小是-128
-128

浮点型

单精度:single 函数

双精度:double 函数

数值数据默认是双精度型。

1
2
3
4
5
6
>> class(4)
ans =
'double'
>> class(single(4))
ans =
'single'

复型

实部和虚部默认双精度型。虚数单位用 i 或 j 来表示。

1
6+5i6+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
2
>> x = sin(pi/2)    # 弧度制
>> x = sind(90) # 角度制
1
2
>> x = sqrt(7)-2i   # 复数
>> y = exp(pi/2) # e的pi/2次幂
1
2
3
4
5
>> x = 1 : 100
>> k = isprime(x) # 输出的是0/1的布尔值
>> k1 = find(k) # 输出的是1:100之间的素数
>> p = x(k) # 同上
>> p1 = x(k1) # 同上

变量

变量名以字母开头,只能由字母、数字和下划线组成,最多63个字符。变量名区分字母的大小写。标准函数名以及命令名必须用小写字母。

预定义变量

ans 是默认赋值变量

i 和 j 代表虚数单位

pi 代表圆周率

NaN 代表非数

变量管理

用 who 和 whos 查看变量。

用于保存MATLAB工作区变量的文件叫内存变量文件,扩展名为.mat,也叫 MAT 文件。

save 命令:创建内存变量文件

load 命令:装入内存变量文件

1
2
>> save mydata a x   # mydata.mat
>> load mydata

MATLAB矩阵

矩阵的建立

1)直接输入法

将矩阵元素用 [ ] 括起来,按矩阵行的顺序输入各元素,同一行元素用逗号或空格分隔,不同行用分号分隔。

1
2
3
4
>> A = [1, 2, 3; 4, 5, 6]
A =
1 2 3
4 5 6

2)利用已建好的矩阵建立更大的矩阵

1
2
3
>> A = [1,2,3;4,5,6;7,8,9]
>> B = [-1,0,3;4,2,-5;9,-6,1]
>> C = [A, B; B, A]

还可以用实部矩阵和虚部矩阵构成复数矩阵

1
2
3
>> B = [1,2,3;4,5,6]
>> C = [6,7,8;9,10,11]
>> A = B + i*C

冒号表达式

1
e1 : e2 : e3

e1 为初始值,e2 为步长,e3 为终止值。

1
2
3
>> t = 0 : 1 : 5
t =
0 1 2 3 4 5

e2 可以省略,默认为 1.

linspace函数

1
linspace(a, b, n)

a 为第一个元素,b 为最后一个元素,n 为元素总数。

1
2
3
>> x = linspace(0, pi, 6)
x =
0 0.6283 1.2566 1.8850 2.5133 3.1416

结构矩阵和单元矩阵

结构矩阵

格式为:结构矩阵元素 . 成员名 = 表达式

1
2
>> a(1).x1 = 10; a(1).x2 = 'A'; a(1).x3 = [1, 2, 3];
>> a(2).x1 = 16; a(2).x2 = 'K'; a(2).x3 = [9, 2, 7];

单元矩阵

和一般矩阵相似,但是要用 { } 括起来。

1
2
3
4
>> b = {10,'A',[1,2,3]; 16,'K',[9,2,7]}   # b是 2×3 cell数组
b =
{[10]} {'A'} {1×3 double}
{[16]} {'K'} {1×3 double}

矩阵元素的引用

通过下标引用

1
>> A(4, 5) = 10   # 矩阵A的第4行第5列元素赋值为10
1
2
3
4
5
6
7
>> A = [1,2,3;4,5,6]   # A是2行3列
>> A(4, 5) = 10 # 超出矩阵范围,自动填充为0
A =
1 2 3 0 0
4 5 6 0 0
0 0 0 0 0
0 0 0 0 10

通过序号引用

在MATLAB中,矩阵元素按列存储。矩阵元素的序号就是其在内存中的排列顺序。

1
2
3
4
5
6
7
>> A = [1,2,3;4,5,6]
A =
1 2 3
4 5 6
>> A(3)
ans =
2

序号与下标是一一对应的,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
2
3
4
5
6
7
8
>> A = [1:3;4:6]
A =
1 2 3
4 5 6
>> B = sub2ind(size(A),[1,2;2,2],[1,1;3,2])
B =
1 2
6 4

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
2
3
4
5
>> [I, J] = ind2sub([3,3], [1,3,5])
I =
1 3 2
J =
1 1 2

利用冒号表达式获得子矩阵

1
2
3
4
A(i, :)              第i行的全部元素
A(:, j) 第j列的全部元素
A(i:i+m, k:k+n) 第i~i+m行且在第k~k+n列的全部元素
A(i:i+m, :) 第i~i+m行的全部元素

end运算符:表示某一维的末尾元素下标。(注意是某一维,可以是行或列)

1
2
>> A(end, :)          # 最后一行
>> A([1,4], 3:end) # 第1、4行从第3列到最后一列的元素

删除矩阵中的元素

利用空矩阵删除矩阵的元素

空矩阵是指没有任何元素的矩阵。

1
>> x = []
1
2
3
4
5
6
>> A = [1,2,3,0,0;7,0,9,2,6;1,4,-1,1,8]
>> A(:, [2,4]) = [] # 删除了第2、4列元素
A =
1 3 0
7 9 6
1 -1 8

改变矩阵的形状

reshape(A, m, n):在矩阵总元素保持不变的前提下,将矩阵 A 重新排成 m * n 的二维矩阵。

reshape 函数只改变原矩阵的行数和列数,但并不改变原矩阵元素个数及其存储顺序。

A(:) 是将 A 的每一列元素堆叠起来,成为一个列向量。

1
2
3
4
5
6
7
8
9
>> A = [1,2,3;4,5,6]
>> B = A(:)
B =
1
4
2
5
3
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
2
>> x = 1:3:7
>> y = sin(x) .* cos(x)

关系运算

关系运算符

1
<    <=    >    >=    ==    ~=

当参与比较的是两个同型的矩阵时,是对应位置的元素按照标量关系运算规则逐个进行,最后得到的结果是一个与原矩阵同型的矩阵,它的元素由 0 / 1 组成。

当参与比较的是一个标量和一个矩阵时,是这个标量与矩阵中的每一个元素进行比较,最后得到的结果是一个与原矩阵同型的矩阵,它的元素由 0 / 1 组成。

逻辑运算符

1
&(与)    |(或)    ~(非)

在算术运算、关系运算与逻辑运算中,算术运算的优先级最高,逻辑运算的优先级最低,但非(~)是单目运算符,优先级高于双目运算符。

例如判断水仙花数(一个三位数,其三位上的数字的立方之和等于这个数本身):

1
2
3
4
5
6
m = 100 : 999;
m1 = rem(m, 10);
m2 = rem(fix(m/10), 10);
m3 = fix(m/100);
k = find(m == m1.*m1.*m1 + m2.*m2.*m2 + m3.*m3.*m3);
s = m(k);
1
2
3
4
5
6
>> k      # 序号
k =
54 271 272 308
>> s # 元素
s =
153 370 371 407

字符串处理

在MATLAB中,字符串是用单引号括起来的字符序列。

1
2
3
4
>> s = 'preccrep workstation'
>> ss = s(1:8)
ss =
'preccrep'

若字符串中的字符含有单引号,则该字符要用两个单引号来表示。

1
2
3
>> 'I''m a hacker.'
ans =
'I'm a hacker.'

还可建立多行字符串,形成字符串矩阵:

1
2
3
4
>> ch = ['abcdef'; '123456']
>> ch(2, 3)
ans =
'3'

例如:建立一个字符串向量,然后做如下处理:

  1. 取第1~5个字符作为子字符串;
  2. 将字符串倒序排列;
  3. 将字符串中的小写字母全部变为大写;
  4. 统计字符串中的小写字母数。
1
2
3
4
5
6
>> ch = 'ABc123dhUn'
>> subch = ch(1:5)
>> revch = ch(end:-1:1)
>> k = find(ch>='a' & ch<='z')
>> ch(k) = ch(k)-('a'-'A')
>> length(k)

字符串的执行

eval(s) 是将字符串 s 当作命令执行,也就是用来执行一个字符串表达式,并返回表达式的值。

1
2
3
t = pi;
m = '[t, sin(t), cos(t)]';
r = eval(m);
1
2
3
>> r
r =
3.1416 0.0000 -1.0000

字符串与数值之间的转换

abs 和 double 都可以用来获取字符串矩阵所对应的 ASCII 码数值矩阵。

char 函数可以把 ACSII 码矩阵转换为字符串矩阵。

1
2
3
4
5
6
7
>> s1 = 'MATLAB'
>> a = ans(s1)
a =
77 65 84 76 65 66
>> s2 = char(a+32)
s2 =
'matlab'

字符串的比较

两种方法:利用关系运算符比较和字符串比较函数。

关系运算符比较:两个字符串长度相等时,每个字符逐个比较,返回结果是一个数值向量,其元素为0/1。

字符串比较函数:用来判断字符串是否相等。

  1. strcmp() 函数的基本功能是比较两个字符串是否相等,相等返回 1,否则返回 0。其基本用法是:
1
ans = strcmp(s1, s2)

但是,如果我们要查找字符串数组中等于某字符串的索引时,该如果操作?strcmp() 函数也提供了这个功能,用法相同,其中,s1是字符串数组,s2是字符串,返回值为逻辑类型,大小与字符串数组s1相同。

  1. strncmp(s1, s2, n) 比较前 n 个字符。
  2. strcmpi(s1, s2) 在忽略字母大小写的情况下,比较两字符串是否相等。
  3. strncmpi(s1, s2, n) 同理。

字符串的查找与替换

findstr(s1, s2) 返回短字符串在长字符串中的开始位置。

strrep(s1, s2, s3) 将字符串 s1 中的所有子串 s2 替换为字符串 s3。

strfind() 用于查找字符串数组中包含某字符串的记录:

1
k = strfind(str, pattern)

输出结果k表示pattern在str中出现的位置,若不出现,则返回[]。比如:

1
2
3
4
S = ‘Find the starting indices of the pattern string’;
k = strfind(S, ‘in’)
k =
2 15 19 45
本文作者 : 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 许可协议。转载请注明出处!
留下足迹

博客已萌萌哒运行(●'◡'●)ノ♥
Theme - BMW | Made With 💗 | Powered by GodBMW