n 阶方阵 A 满足 $ a_{ij} = a_{ji} $($ 1 \le i, j \le n $)。
用一维数组存储下三角(含对角线)元素:
当 $ i \ge j $(下三角):
$$k = \frac{i(i-1)}{2} + (j-1) = \frac{i(i-1)}{2} + j - 1$$当 $ i < j $(上三角),利用 $ a_{ij} = a_{ji} $:
$$k = \frac{j(j-1)}{2} + i - 1$$地址计算:$ LOC(a_{ij}) = LOC(a_{11}) + k \times sizeof(ElemType) $。
下三角全为常数 c(或 0)。压缩存储上三角 + 一个常数 c,元素个数 $ n(n+1)/2 + 1 $。
上三角元素 $ a_{ij} $($ i \le j $)下标:
$$k = \frac{(i-1)(2n-i+2)}{2} + (j-i)$$上三角全为常数 c。下三角元素 $ a_{ij} $($ i \ge j $):
$$k = \frac{i(i-1)}{2} + (j-1)$$与对称矩阵下三角公式相同;常数统一映射到最后一个位置。
只有主对角线及其上下各一条对角线有非零元素。
当 $ |i-j| \le 1 $ 时:
$$k = 2(i-1) + (j-1) = 2i + j - 3$$反向映射(已知 k 求 i,j):
$$i = \left\lfloor \frac{k+1}{3} \right\rfloor + 1,\quad j = k - 2(i-1) + 1 = k - 2i + 3$$非零元素个数远小于元素总数(通常 $ t < 0.05 \times m \times n $)。
typedef struct {
int i, j; // 行号、列号
ElemType val; // 元素值
} Triple;
typedef struct {
Triple data[MAXSIZE+1]; // data[0]未用或存矩阵信息
int mu, nu, tu; // 行数、列数、非零元素个数
} TSMatrix;
typedef struct OLNode {
int i, j;
ElemType val;
struct OLNode *right, *down; // 行链、列链
} OLNode, *OLink;
typedef struct {
OLink *rhead, *chead; // 行头、列头指针数组
int mu, nu, tu;
} CrossList;
4 阶对称矩阵,按行优先存下三角,起始地址 100,每元素 2 字节。求 $ a_{32} $:$ i=3,j=2 $,$ i\ge j $,下三角,
$ k = \frac{3\times2}{2} + 2 - 1 = 3 + 1 = 4 $,$ LOC = 100 + 4\times2 = 108 $。
求 $ a_{23} $:$ i<j $,利用对称 $ a_{23}=a_{32} $,$ k=4 $,$ LOC=108 $。
5 阶三对角,$ a_{34} $:$ i=3,j=4,|3-4|=1\le1 $,$ k = 2\times3 + 4 - 3 = 7 $。
| 下标 | i | j | val |
|---|---|---|---|
| 0 | 1 | 3 | 3 |
| 1 | 2 | 2 | 4 |
| 2 | 3 | 1 | 5 |
| 3 | 4 | 4 | 6 |
| 矩阵类型 | 压缩后元素数 | 节省空间 |
|---|---|---|
| 对称矩阵 | n(n+1)/2 | n(n-1)/2 |
| 三角矩阵 | n(n+1)/2+1 | n(n-1)/2−1 |
| 三对角矩阵 | 3n−2 | n²−3n+2 |
↑ 以上为站内 HTML 相对链接(纯网页可浏览);本页右上「在 Obsidian 中打开」跳回源笔记。