1. 对称矩阵压缩
[
a
x
x
x
x
x
b
x
x
x
x
x
c
x
x
x
x
x
d
x
x
x
x
x
e
]
\begin{bmatrix} a& x& x& x&x \\ x& b& x& x&x \\ x& x& c& x&x \\ x& x& x& d&x \\ x& x& x& x&e \end{bmatrix}
⎣⎢⎢⎢⎢⎡axxxxxbxxxxxcxxxxxdxxxxxe⎦⎥⎥⎥⎥⎤
[
a
x
b
x
x
c
x
x
x
d
x
x
x
x
e
]
\begin{bmatrix} a& & & & \\ x& b& & & \\ x& x& c& & \\ x& x& x& d& \\ x& x& x& x&e \end{bmatrix}
⎣⎢⎢⎢⎢⎡axxxxbxxxcxxdxe⎦⎥⎥⎥⎥⎤
二维数组中
a
i
j
a_{ij}
aij在一维数组中的下标:
k
=
i
(
i
−
1
)
/
2
+
j
−
1
k=i(i-1)/2+j-1
k=i(i−1)/2+j−1
对于对称矩阵我们可以只保存下三角(包括对角线上的元素),或上三角的元素
原来需要的存储单元个数 n × n n \times n n×n 变成了 ( n ( n + 1 ) / 2 ) (n(n+1)/2) (n(n+1)/2)
2. 上下三角矩阵压缩
2.1 下三角对称矩阵压缩
对于
[
a
11
a
21
a
22
a
31
a
32
a
33
a
41
a
42
a
43
a
44
a
51
a
52
a
53
a
54
a
55
]
\begin{bmatrix} a_{11}& & & & \\ a_{21}& a_{22}& & & \\ a_{31}& a_{32}& a_{33}& & \\ a_{41}& a_{42}& a_{43}& a_{44}& \\ a_{51}& a_{52}& a_{53}& a_{54}& a_{55} \end{bmatrix}
⎣⎢⎢⎢⎢⎡a11a21a31a41a51a22a32a42a52a33a43a53a44a54a55⎦⎥⎥⎥⎥⎤
将
[
a
11
.
.
.
a
i
1
.
.
.
a
i
j
.
.
.
.
.
.
a
n
1
.
.
.
a
n
j
.
.
.
a
n
n
]
\begin{bmatrix} a_{11}& & & & \\ ...\\ a_{i1}& ...& a_{ij}& ...& \\ ... \\ a_{n1}& ...& a_{nj}& ...& a_{nn} \end{bmatrix} \\
⎣⎢⎢⎢⎢⎡a11...ai1...an1......aijanj......ann⎦⎥⎥⎥⎥⎤
转化为
[
a
11
.
.
.
a
i
1
.
.
.
a
i
j
.
.
.
a
n
1
.
.
.
a
n
j
.
.
.
a
n
n
]
\begin{bmatrix} a_{11}& ...& a_{i1}& ...& a_{ij}& ...& a_{n1}& ...& a_{nj}& ...& a_{nn}&\\ \end{bmatrix} \\
[a11...ai1...aij...an1...anj...ann]
原矩阵中的下标
i
,
j
i,j
i,j,对应于数组中的下标
k
k
k
2.2 上三角对称矩阵压缩
对于
[
a
11
a
12
a
13
a
14
a
22
a
23
a
24
a
33
a
34
a
44
]
\begin{bmatrix} a_{11}& a_{12}& a_{13}& a_{14}\\ & a_{22}& a_{23}& a_{24}\\ & & a_{33}& a_{34}\\ & & & a_{44}\\ \end{bmatrix}
⎣⎢⎢⎡a11a12a22a13a23a33a14a24a34a44⎦⎥⎥⎤
将
[
a
11
.
.
.
a
1
j
.
.
.
a
1
n
.
.
.
.
.
.
a
i
j
.
.
.
a
i
n
.
.
.
a
n
n
]
\begin{bmatrix} a_{11}& ...& a_{1j}& ...& a_{1n}\\ & & ...& &...\\ & & a_{ij}& ...& a_{in}\\ & & & &... \\ & & & & a_{nn} \end{bmatrix} \\
⎣⎢⎢⎢⎢⎡a11...a1j...aij......a1n...ain...ann⎦⎥⎥⎥⎥⎤
转化为
[
a
11
.
.
.
a
1
j
.
.
.
a
1
n
.
.
.
a
i
j
.
.
.
a
i
n
.
.
.
a
n
n
]
\begin{bmatrix} a_{11}& ...& a_{1j}& ...& a_{1n}& ...& a_{ij}& ...& a_{in}& ...& a_{nn}&\\ \end{bmatrix} \\
[a11...a1j...a1n...aij...ain...ann]
原矩阵中的下标
i
,
j
i,j
i,j,对应于数组中的下标
k
k
k
即:
k
=
(
i
−
1
)
(
2
n
−
i
+
2
)
/
2
+
j
−
i
k=(i-1)(2n-i+2)/2+j-i
k=(i−1)(2n−i+2)/2+j−i
2. 对角矩阵压缩
将矩阵
[
a
11
a
12
0
0
0
a
21
a
22
a
23
0
0
0
a
32
a
33
a
34
0
0
0
a
43
a
44
a
45
0
0
0
a
54
a
55
]
\begin{bmatrix} a_{11}& a_{12}& 0& 0&0 \\ a_{21}& a_{22}& a_{23}&0 &0 \\ 0& a_{32}& a_{33}& a_{34}&0 \\ 0& 0& a_{43}& a_{44}& a_{45}\\ 0& 0& 0&a_{54} &a_{55} \end{bmatrix}
⎣⎢⎢⎢⎢⎡a11a21000a12a22a32000a23a33a43000a34a44a54000a45a55⎦⎥⎥⎥⎥⎤
压缩为一维矩阵
[
a
11
a
12
a
21
a
22
a
23
a
32
a
33
a
34
a
43
a
44
a
45
a
54
a
55
]
\begin{bmatrix} a_{11}& a_{12}& a_{21}& a_{22}& a_{23}& a_{32}& a_{33}& a_{34}& a_{43}& a_{44}& a_{45}& a_{54}& a_{55} \end{bmatrix}
[a11a12a21a22a23a32a33a34a43a44a45a54a55]
原来
n
×
n
n \times n
n×n个存储单元现在只要
3
n
−
2
3n-2
3n−2个
原矩阵中的下标
i
,
j
i,j
i,j,对应于数组中的下标
k
k
k
即
k
=
2
i
+
j
−
3
k=2i+j-3
k=2i+j−3
已知
k
k
k:
{
i
=
⌊
(
k
+
1
)
/
3
⌋
+
1
j
=
k
−
2
i
+
3
\begin{cases} i=\left \lfloor (k+1)/3 \right \rfloor+1 \\ j=k-2i+3 \end{cases}
{i=⌊(k+1)/3⌋+1j=k−2i+3