MATLAB矩阵处理

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

特殊矩阵

zeros函数:产生全 0 矩阵

ones函数:产生全 1 矩阵

eye函数:产生对角线为 1 的矩阵。当矩阵是方阵时,得到一个单位矩阵。

rand函数:产生(0,1)区间均匀分布的随机矩阵。

randn函数:产生均值为 0,方差为 1 的标准正态分布随机矩阵。

randi函数:生成均匀分布的伪随机整数。

randi (iMax) 在开区间 (0, iMax) 生成均匀分布的伪随机整数;

randi (iMax, m, n) 在开区间 (0, iMax) 生成 m * n 型随机矩阵;

randi ([iMin, iMax], m, n) 在开区间 (iMin, iMax) 生成 m * n 型随机矩阵。

详细可参考:click here

1
2
3
zeros(m):产生 m * m 零矩阵
zeros(m, n):产生 m * n 零矩阵
zeros(size(A)): 产生与矩阵A同样大小的零矩阵
1
2
3
4
5
6
7
8
9
>> A = zeros(2, 3)
A =
0 0 0
0 0 0
>> A = zeros(size(reshape(A, 3, 2)))
A =
0 0
0 0
0 0

通用的特殊矩阵

eg. 首先产生 5 阶两位随机整数矩阵 A,再产生均值为 0.6、方差为 0.1 的 5 阶正态分布随机矩阵 B,最后验证 (A + B) I = I A + B I,其中 I 为单位矩阵。

rand函数:产生(0,1)区间均匀分布的随机数 x。

fix(a + (b - a + 1) * x):产生 [a, b] 区间上均匀分布的随机整数。

randn函数:产生均值为 0、方差为 1 的标准正态分布随机数 x。

μ + σx:得到均值为 μ、方差为 σ2 的随机数。

1
2
3
4
>> A = fix(10 + (99 - 10 + 1) * rand(5))    # 产生5行5列随机矩阵A
>> B = 0.6 + sqrt(0.1) * randn(5) # 均值为0.6,方差为0.1的5行5列正态分布随机矩阵B
>> C = eye(5)
>> (A + B) * C == C * A + B * C

用于专门学科的特殊矩阵

魔方矩阵—Magic Square

是有相同的行数和列数,并在每行每列、对角线上的和都相等的矩阵。魔方矩阵中的每个元素不能相同。

1
2
3
4
5
>> M = magic(3)
M =
8 1 6
3 5 7
4 9 2

n 阶魔方阵由 1,2,3,…,n2 共 n2 个整数组成,且每行、每列以及主、副对角线上各 n 个元素之和都相等。

n 阶魔方阵每行每列元素之和为(1 + 2 + 3 + … + n2) / n = (n + n3) / 2。

注:1 + 2 + 3 +…+ n2 = (n2 + n4) / 2,可用数学归纳法证明。

magic(n) 产生的是一个特定的魔方阵。

1
2
3
4
5
6
7
8
9
10
>> M = magic(8)
>> sum(M(1,:))
ans =
260
>> sum(M(:,:))
ans =
260 260 260 260 260 260 260 260
>> sum(M(:,1))
ans =
260

范德蒙矩阵

vander(V) 生成以向量 V 为基础的 Vandermonde 矩阵。

1
2
3
4
5
6
7
>> A = vander(1:5)
A =
1 1 1 1 1
16 8 4 2 1
81 27 9 3 1
256 64 16 4 1
625 125 25 5 1

Vandermonde 矩阵常用在各种通信系统的纠错编码中,例如,常用的 Reed-Solomon 编码就以其为基础。

希尔伯特矩阵

H (i, j) = 1 / (i + j - 1),i、j分别为其行标和列标。

hilb(n) 生成n阶 Hilbert 矩阵。

invhilb(n) 求n阶 Hilbert 矩阵的逆,使用其他方法求逆会因为原始数据的微小扰动而产生不可靠的计算结果。

1
2
3
4
5
6
7
>> format rat       # 以有理数形式输出
>> H = hilb(4)
H =
1 1/2 1/3 1/4
1/2 1/3 1/4 1/5
1/3 1/4 1/5 1/6
1/4 1/5 1/6 1/7

伴随矩阵

compan(p),其中 p 是一个多项式的系数向量,高次幂系数在前,低次幂系数在后。

1
2
3
4
5
6
7
# x^3-2x^2-5x+6
>> p = [1, -2, -5, 6]
>> A = compan(p)
A =
2 5 -6
1 0 0
0 1 0

帕斯卡矩阵

帕斯卡矩阵的第一行元素和第一列元素都为 1,其余位置的元素是该元素的左边元素与上面元素相加。

1
2
P(i, j) = P(i - 1, j) + P(i, j - 1)
P(1, j) = P(i, 1) = 1

pascal(n)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
>> format rat
>> P = pascal(5)
P =
1 1 1 1 1
1 2 3 4 5
1 3 6 10 15
1 4 10 20 35
1 5 15 35 70
>> inv(P) # 其逆矩阵所有元素都是整数
ans =

5 -10 10 -5 1
-10 30 -35 19 -4
10 -35 46 -27 6
-5 19 -27 17 -4
1 -4 6 -4 1

矩阵变换

对角矩阵:只有对角线上有非零元素的矩阵。

数量矩阵:对角线上的元素相等的对角矩阵。

单位矩阵:对角线上的元素都为 1 的对角矩阵。

提取对角线元素

diag(A):提取矩阵 A 的主对角线元素,产生一个列向量。

diag(A):提取矩阵 A 第 k 条对角线的元素,产生一个列向量。

构造对角矩阵

diag(V):以向量 V 为主对角线元素,产生对角矩阵。

diag(V, k):以向量 V 为第 k 条对角线元素,产生对角矩阵。

上三角矩阵

triu(A):提取矩阵 A 的主对角线及以上的元素。

triu(A, k):提取矩阵 A 的第 k 条对角线及以上的元素。

1
2
3
4
5
6
>> triu(ones(4), -1)
ans =
1 1 1 1
1 1 1 1
0 1 1 1
0 0 1 1

下三角矩阵

tril(A)

矩阵的转置

转置运算符是小数点后面接单引号( .’ )。

共轭转置,其运算符是单引号( ‘ ),它在转置的基础上还要取每个数的复共轭。

1
2
3
4
5
6
7
8
9
10
11
12
>> A = [1, 3; 3+4i, 1-2i]
A =
1.0000 + 0.0000i 3.0000 + 0.0000i
3.0000 + 4.0000i 1.0000 - 2.0000i
>> A.'
ans =
1.0000 + 0.0000i 3.0000 + 4.0000i
3.0000 + 0.0000i 1.0000 - 2.0000i
>> A'
ans =
1.0000 + 0.0000i 3.0000 - 4.0000i
3.0000 + 0.0000i 1.0000 + 2.0000i

矩阵的翻转

fliplr(A):对矩阵 A 实施左右翻转。

flipud(A):对矩阵 A 实施上下翻转。

例如,验证魔方阵的主对角线、副对角线元素之和相等。

1
2
3
4
5
>> A = magic(5)
>> a1 = sum(diag(A))
>> B = flipud(A)
>> a2 = sum(diag(B))
>> a1 == a2

矩阵求值

方阵的行列式

det(A):求方阵 A 所对应的行列式的值。

验证 det(A^-1) = 1 / det(A).

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
>> format rat
>> A = randi([1,10], 3, 3)
A =
5 10 4
1 5 10
10 5 4
>> B = inv(A)
B =
-1/21 -2/63 8/63
16/105 -2/63 -23/315
-1/14 5/42 1/42
>> a2 = det(B)
a2 =
1/630
>> a1 = 1/det(A)
a1 =
1/630

矩阵的秩

rank(A)

求 3~20 阶魔方阵的秩。

1
2
3
4
5
6
for n = 3:20
r(n) = rank(magic(n));
end
bar(r);
grid on
axis([2,21,0,20])

avatar

矩阵的迹

等于矩阵的对角线元素之和,也等于特征值之和。

trace(A)

本文作者 : preccrep
原文链接 : https://preccrep.github.io/2020/07/15/MATLAB%E7%9F%A9%E9%98%B5%E5%A4%84%E7%90%86/
版权声明 : 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!
留下足迹

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