Matlab-数组与矩阵


这一篇文章将较深入讨论Matlab中数组与矩阵的用法。

数组

创建数组

方括号直接定义

见第一篇文章1.1

通过冒号

X=A:step:B
其中A是一维数组第一个元素,step是相邻两元素差值,直到最后一个元素和B的差的绝对值小于等于step的绝对值为止。
不指定step时,系统默认step=1.

logspace函数

y=logspace(a,b,n)
logspace,顾名思义可以理解为对数空间。该函数会创建行向量y,第一个元素为10a,最后一个元素为10b,形成元素总数为n的等比数列.
此函数也可写作y=logspace(a,b),默认n为50.

1
2
3
4
5
>> y=logspace(1,3,3)
y =
10 100 1000

linspace函数

y=linspace(a,b,n)
linspace,顾名思义可以理解为线性空间。该函数会创建行向量y,第一个元素为a,最后一个元素为b,形成元素总数为n的等差数列.
此函数也可写作y=linspace(a,b),默认n为100.

1
2
3
4
5
>> y=linspace(1,10,10)
y =
1 2 3 4 5 6 7 8 9 10

注:当n<2时,函数返回b数值.

数组运算

数值运算

加减运算

维度相同的数组对应位置元素相加减。

1
2
3
4
5
6
7
8
9
10
11
12
13
>> A=[1 2 3 4 5 6];
>> B=[6 5 4 3 2 1];
>> A+B
ans =
7 7 7 7 7 7
>> A-B
ans =
-5 -3 -1 1 3 5

乘法运算

1
2
3
4
5
6
>> A=[1 2 3 4 5 6];B=[6 5 4 3 2 1];
>> A.*B
ans =
6 10 12 12 10 6

维度相同的数组对应位置元素相乘。
注意此处有一个点运算符,与乘号连用,以区别于以下向量乘法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
>> A=[1 2 3 4 5 6];
>> B=B' %将行向量B转置为列向量
B =
6
5
4
3
2
1
>> A*B
ans =
56

除法运算

数组与常数相除

数组中每一个元素除以该常数

1
2
3
4
5
6
>> A=[1 5 6 8 9 6];
>> A./3
ans =
0.3333 1.6667 2.0000 2.6667 3.0000 2.0000

数组与常数相除可不加点运算符,含义一致。

左除与右除
1
2
3
4
5
6
7
8
9
10
11
12
13
>> A=[1 5 6 8 9 6];
>> B=[9 5 6 2 4 0];
>> A.\B %左除
ans =
9.0000 1.0000 1.0000 0.2500 0.4444 0
>> A./B %右除
ans =
0.1111 1.0000 1.0000 4.0000 2.2500 Inf

左除与右除记号很好区分,就看斜线上端侧向哪边。左除在键盘backspace键下方。我们日常使用的都是右除。
左除与右除的概念,即到底是谁除谁,可以这样看。谁在上方谁就是分子。比如左除‘ A.\B ’,可看作B在上方,所以是用B中元素除以A中对应位置的元素。

乘方运算

数组中每一个元素进行乘方,或者某数字做数组中每一个元素的次方运算。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
>> A.^3
ans =
1 125 216 512 729 216
>> 3.^A
ans =
1 至 5 列
3 243 729 6561 19683
6 列
729

关系运算

<    小于
<=    小于等于
>    大于
>=    大于等于
==    恒等于
~=    不等于

逻辑运算

&    与
|    或
~    非
逻辑运算对单个元素来说,非零为真,逻辑运算结果为1.

矩阵

创建矩阵

第一篇文章1.1以及第二篇文章1.1,都有关于矩阵创建的一些常用函数。这里我们了解几个颇有特色的矩阵,它们在系统测试、数学模拟等方面有着重要作用。

希尔伯特(Hilbert)矩阵

希尔伯特矩阵也称H阵,其元素为Hij=1/(i+j-1).

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
>> A=hilb(3) %生成3×3的希尔伯特矩阵
A =
1.0000 0.5000 0.3333
0.5000 0.3333 0.2500
0.3333 0.2500 0.2000
>> B=invhilb(3) %生成3×3的希尔伯特矩阵的逆矩阵且为整数
B =
9 -36 30
-36 192 -180
30 -180 180

希尔伯特矩阵与其逆矩阵都是对称矩阵,文章封面的图片就是用灰阶图表示的希尔伯特矩阵。

托普利兹(Toeplitz)矩阵

由两个向量定义,一个行向量,一个列向量。
命令toeplitz(k,r)
生成非对称托普利兹矩阵,第一列为k,第一行为r(k,r均为向量).其余元素等于该元素左上角元素的值.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
>> toeplitz(2:5,2:2:8)
ans =
2 4 6 8
3 2 4 6
4 3 2 4
5 4 3 2
>> toeplitz(2:5) %用同一向量定义托普利兹矩阵
ans =
2 3 4 5
3 2 3 4
4 3 2 3
5 4 3 2

0~1均匀分布的随机矩阵

r=rand(n)   产生n×n的矩阵,其元素均为0~1间均匀分布的样本.
r=rand(m,n)   产生n×m的矩阵,其元素性质同上.
更高维度的矩阵依次增加括号中数字个数即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
>> rand(3,3,3)
ans(:,:,1) =
0.8147 0.9134 0.2785
0.9058 0.6324 0.5469
0.1270 0.0975 0.9575
ans(:,:,2) =
0.9649 0.9572 0.1419
0.1576 0.4854 0.4218
0.9706 0.8003 0.9157
ans(:,:,3) =
0.7922 0.0357 0.6787
0.9595 0.8491 0.7577
0.6557 0.9340 0.7431

本例产生了一个3×3×3的立方矩阵,矩阵中的元素像三阶魔方一样排列在三维空间中.

标准正态分布随机矩阵

r=randn(n)
与上一种矩阵的区别就是总体分布由0~1的均匀分布,变为标准正态分布。命令即‘rand’后多加一个字母‘n’.

魔方矩阵

魔方矩阵每行、列、对角线上元素和相等。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
>> A=magic(3)
A =
8 1 6
3 5 7
4 9 2
>> sum(A) %计算每行的和(sum函数的作用)
ans =
15 15 15
>> sum(A') %计算每列的和('用作转置)
ans =
15 15 15

帕斯卡矩阵

A=pascal(n)   返回n阶对称正定Pascal矩阵.

范德蒙德(Vandermonde)矩阵

A=vander(v)   矩阵的列是向量v的幂,即A(i,j)=v(n-j)(i)

1
2
3
4
5
6
7
8
>> A=vander([1 2 3 4])
A =
1 1 1 1
8 4 2 1
27 9 3 1
64 16 4 1

编辑矩阵

合并矩阵

见第一篇文章1.2.3

删除行列

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
>> A=vander([1 2 3 4])
A =
1 1 1 1
8 4 2 1
27 9 3 1
64 16 4 1
>> A(2,:)=[] %删除第2行
A =
1 1 1 1
27 9 3 1
64 16 4 1
>> A(:,2)=[] %删除第2列
A =
1 1 1
27 3 1
64 4 1

重构矩阵

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
A =
1 至 3 列
2.0000 + 0.0000i 4.0000 + 0.0000i 6.0000 + 0.0000i
3.0000 + 0.0000i 2.0000 + 0.0000i 4.0000 + 0.0000i
4.0000 + 0.0000i 3.0000 + 0.0000i 2.0000 + 0.0000i
5.0000 + 1.0000i 4.0000 + 1.0000i 3.0000 + 1.0000i
4 列
8.0000 + 0.0000i
6.0000 + 0.0000i
4.0000 + 0.0000i
2.0000 + 1.0000i
>> A.' %仅转置矩阵A
ans =
1 至 3 列
2.0000 + 0.0000i 3.0000 + 0.0000i 4.0000 + 0.0000i
4.0000 + 0.0000i 2.0000 + 0.0000i 3.0000 + 0.0000i
6.0000 + 0.0000i 4.0000 + 0.0000i 2.0000 + 0.0000i
8.0000 + 0.0000i 6.0000 + 0.0000i 4.0000 + 0.0000i
4 列
5.0000 + 1.0000i
4.0000 + 1.0000i
3.0000 + 1.0000i
2.0000 + 1.0000i
>> A' %转置矩阵A,同时如果A中元素是复数,那么所有元素也是共轭的.
ans =
1 至 3 列
2.0000 + 0.0000i 3.0000 + 0.0000i 4.0000 + 0.0000i
4.0000 + 0.0000i 2.0000 + 0.0000i 3.0000 + 0.0000i
6.0000 + 0.0000i 4.0000 + 0.0000i 2.0000 + 0.0000i
8.0000 + 0.0000i 6.0000 + 0.0000i 4.0000 + 0.0000i
4 列
5.0000 - 1.0000i
4.0000 - 1.0000i
3.0000 - 1.0000i
2.0000 - 1.0000i

矩阵元素运算

加减运算

相同维度的矩阵对应元素(或常数)相加(减).

乘法运算

数乘

矩阵相乘

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
>> A
A =
2 1 4 0
1 -1 3 4
>> B
B =
1 3 1
0 -1 2
1 -3 1
4 0 -2
>> A*B
ans =
6 -7 8
20 -5 -6
>> B*A
错误使用 *
内部矩阵维度必须一致。

除法运算

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
>> A
A =
1 2
1 3
>> B
B =
1 0
1 2
>> A\B %左除
ans =
1 -4
0 2
>> A/B %右除
ans =
0 1.0000
-0.5000 1.5000

幂运算

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
A =
2 3 8
3 1 -1
5 0 4
>> A^2
ans =
53 9 45
4 10 19
30 15 56
>> A^5
ans =
37496 13827 52622
10077 2887 11891
34295 11250 44464

元素查找:find函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
>> A=[1 3 0;3 1 0;9 2 4]
A =
1 3 0
3 1 0
9 2 4
>> B=find(A); %矩阵中非零元素的下标
>> C=find(A>=1); %矩阵中大于等于1的元素下标
>> D=A(A>=1); %矩阵中大于等于1的元素
>> BCD=[B,C,D]
BCD =
1 1 1
2 2 3
3 3 9
4 4 3
5 5 1
6 6 2
9 9 4
>> A(find(A==0))=10 %矩阵中的等于0的元素改为10
A =
1 3 10
3 1 10
9 2 4

元素排序:sort函数

按照升序排列,排列后矩阵维数与原矩阵相同。
B=sort(A)   对矩阵A进行升序排列.
B=sort(A,dim)   当dim=1时,按列排序;当dim=2时,按行排列。
B=sort(…,mode)   mode表示可指定排序方式,‘ascend’为升序,‘descend’为降序。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
A =
1 3 0
3 1 0
9 2 4
>> B=sort(A) %按列升序
B =
1 1 0
3 2 0
9 3 4
>> C=sort(A,2) %按行升序
C =
0 1 3
0 1 3
2 4 9
>> D=sort(A,'descend') %按列降序
D =
9 3 4
3 2 0
1 1 0
>> E=sort(A,2,'descend') %按行降序
E =
3 1 0
3 1 0
9 4 2

元素求和:sum与cumsum函数

B=sum(A)   按列求和
B=sum(A,dim)   当dim=1,按列求和;当dim=2,按行求和。
B=cumsum(A,dim)   与sum函数不同的是,cumsum函数返回一个矩阵,每个元素的值为从该列(行)第一个元素到自己的和,我称它为累计和

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
A =
1 3 0
3 1 0
9 2 4
>> B=sum(A) %按列求和
B =
13 6 4
>> C=sum(A,2) %按行求和
C =
4
4
15
>> D=cumsum(A) %按列求累计和
D =
1 3 0
4 4 0
13 6 4
>> E=cumsum(A,2) %按行求累计和
E =
1 4 4
3 4 4
9 11 15
>> F=sum(sum(A)) %求矩阵所有元素的和
F =
23

元素求积:prod与cumprod函数

函数调用方式与求和一样,不多赘述。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
>> A=magic(3)
A =
8 1 6
3 5 7
4 9 2
>> B=prod(A)
B =
96 45 84
>> C=prod(A,2)
C =
48
105
72
>> D=cumprod(A)
D =
8 1 6
24 5 42
96 45 84
>> E=cumprod(A,2)
E =
8 8 48
3 15 105
4 36 72

元素的差分:diff函数

差分:Δf ( xk ) = f ( xk+1 ) - f ( xk )
在矩阵中即后项减前项。
Y=diff(X,n,dim)   计算矩阵在给定维数dim上元素的n阶差分。同样,当dim=1,按列计算;当dim=2,按行计算。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
>> A=magic(3)
A =
8 1 6
3 5 7
4 9 2
>> B=diff(A) %按列求差分
B =
-5 4 1
1 4 -5
>> C=diff(A,2) %按列求2阶差分(即B矩阵再求一次差分)
C =
6 0 -6
>> D=diff(A,1,1) %按列求差分
D =
-5 4 1
1 4 -5
>> E=diff(A,1,2) %按行求差分
E =
-7 5
2 2
5 -7