第五章 数组稀疏矩阵和广义表
- 格式:pdf
- 大小:271.24 KB
- 文档页数:24
float *Max, *Min;
Max = (float *)malloc(sizeof(float )*n); //记录每列最大值 Min = (float *)malloc(sizeof(float )*m); //记录每行最小值 MM = (int *)malloc(sizeof(int )*n); //列最大值位置 mm = (int *)malloc(sizeof(int )*m); //行最小值位置 for (i=0; i<m; i++) { //计算每行中的最小元素
µ2
0 0 0
µ n−1
µn
=BC 其中
q −1 = 0 ;
for (k=0; k<n; k++)
pk = p − µ k qk −1 ; qk =
{
λk
pk
;
}
pn = p − µ n qn−1
(BC)M=D M=C-1(B-1D)
例:计算矩阵 A[m][n]中的马鞍点(第 i 行元素中的最小值, 同时也是第 j 列元素中的最大值) void MaxMin(float **A, int m, int n) { int i, j;
project 5.任意输入正整数 m, n 建立 mxn 矩阵 A,实现算法: (1)将矩阵 A 由二维数组表示转化为三元组表示;(2)求三元 组表示矩阵的转置矩阵; (3)求两个基于三元组表示的 n 阶矩 阵的乘积矩阵(仍采用三元组表示)。
带行表的三元组表 在行优先存储的三元组表增加一个存储每一行第一个非零 元素在三元表中位置的数组。 例:
按层存储,每层按二维数组存储。
存储地址
Loc(i, j , k )
= =
Loc(0,0,0 ) + (k × m1 × m2 + i × m2 + j ) × L
Loc(0,0,0 ) + (c1i + c 2 j + c3 k )
下三角矩阵
a 00 a10 = a 20 a n −1, 0 0 a11 a 21 a n −1,1 0 0 a 22 0 a n −1,n −1 0 0
三对角矩阵:
a 00 a10 = 0 0 a 01 a11 a 21 0 0 a12 a 22 0 0 0 0 0 0 a 23 0 0 0 a n −1,n −1 0
An×n
a n −1,n − 2
存储形式: float A[n], B[n], C[n];
转置矩阵 T5×4
0 0 3 0 = 0 − 2 5 0 0 0
矩阵 M 0 0 1 2 2 3 矩阵 T 0 1 2 2 3 4 2 0 1 3 0 2 1 3 -2 8 5 6 1 3 2 0 4 2 3 5 -2 1 6 8
void TransposeMatrix(TSMatrix a, TSMatrix *b) { int q, col, p; b->m = a.n; b->n = a.m; b->t = a.t; if (b->t <=0) else { q = 0; printf(“M 中无非零元素!\n”);
即:A[i][j]=a[l], 0 <= l < n(n+1)/2 void MatrixMult(float *a, float *b, float **C, int n) { int i, j, k;
float s=0.0; for (i=0; i<n; i++) for (j=0; j<n; j++) { s=0.0; for (k=0; k<n; k++) { if (i>=k) //A 矩阵下三角 l1=i*(i+1)/2+k; else l1=k*(k+1)/2+i; if (k>=j) //B 矩阵下三角元素
A[i ] = ai ,i −1 B[i ] = ai ,i C [i ] = ai ,i +1
1≤ i < n 0≤i<n 0 ≤ i < n −1
例:追赶法解方程组
p µ1 0 0 0 0
λ0
p
0
λ1
p n −1 0
0 M 0 D0 0 M 1 D1 0 M 2 D2 = 0 p λ n −1 M n −1 Dn −1 p µn M n Dn
i 行非零元素个数 2 1 2 1
typedef struct { Triple int data[MaxSize]; RowPos[MaxRow];
其中 p > 1 , λi + µ i
= 1 , i = 1,2,..., n − 1 , λ0 = µ n = 1
对系数矩阵进行 LU 分解
p0 µ1 0 A= 0 0 0 0 p1 0 0 p2 0 0 0 0 0 pn−1 1 q0 0 0 0 1 q1 0 0 0 1 q 2 0 0 0 0 0 0 pn 0 0 0 0 0 0 0 0 0 0 0 0 1 qn−1 0 1
三元组表示
0 0 1 2 2 4 0 4 2 0 1 3 3 7 −1 −1 −2 2
三元组顺序表 //通常按行顺序排列
#define MaxSize 1000; typedef struct { int ElemType }Triple; i, j; e;
typedef struct { Triple int }TSMatrix; data[MaxSize]; m, n, t; //矩阵的行数、列数和非零元素个数
l2=k*(k+1)/2+j; else l2=j*(j+1)/2+k; s=s+a[l1]*b[l2]; } C[i][j]=s; } }
2.稀疏矩阵 稀疏矩阵:矩阵中有 s(远小于矩阵元素个数)个非零元素。 例:
0 0 3 0 −1 0 A = −1 − 2 0 0 0 0 0 0 0 0 0 0 0 2 7 0 0 0 0
Min[i] = A[i][0]; mm[i] = 0; for (j=1; j<n; j++) if (A[i][j]<Min[i]) {Min[i] = A[i][j]; mm[i]=j;} } for (j=0; j<n; j++) //计算每列中最大元素 { Max[j] = A[0][j]; MM[j]=0; for (i=1; i<m; i++) if (A[i][j]>Max[j]) {Max[j] = A[i][j]; MM[j]=i;} } //找马鞍点 for (i=0; i<m; i++) for (j=0; j<n; j++) if ((mm[i] = =j)&&(MM[j]= =i)) printf(“saddle[%d,%d]\n”,i,j); free ((char *)Max); free ((char *)Min); delete []mm; delete []MM; }
记 Am×n = (aij ), 0 ≤ i < m , 0 ≤ 则有:
Loc(i, j ) = Loc(0,0 ) + (i × n + j )L
j<n
其中 L 表示数据元素的存储单元。 三维数组:
Bm1×m2 ×m3 = (bijk ) , 0 ≤ i < m1 , 0 ≤ j < m2 , 0 ≤ k < m3
第五章 数组、稀疏矩阵和广义表
1.多维数组 一维数组:
(a0
a1 a 2 a n −1 )
例:一维信号 二维数组:
Am×n a 00 a10 = a m −1, 0 a 01 a11 a m −1,1 a 02 a12 a m −1, 2 a 0,n −1 a1,n −1 a m −1,n −1
例:已知 A 和 B 是两个 n × n 阶的对称矩阵,采用下三角和一 维数组表示。 基于这一表示写一算法求对称矩阵 A 和 B 的乘 积。 对称矩阵(下三角部分)采用一维数组表示,矩阵元素 aij 在一 维数组中的位置
i (i + 1) / 2 + j l= j ( j + 1) / 2 + i i≥ j i< j
//输入稀疏矩阵 A,生成三元组表 void CreateTriTable(TSMatrix *B, float **A, int m, int n) { int i, j, k=0; for (i=0; i<m; i++) for (j=0; j<n; j++) if (A[i][j] != 0) { B->data[k].i = i; B->data[k].j = j; B->data[k].e = A[i][j];
M 4×5 0 0 = 1 0 3 0 0 −2 0 0 0 8 5 0 0 0 0 0 6 0
三元组表示 0 0 1 2 2 3 1 3 2 0 4 2 3 5 -2 1 6 8
行号 i 0 1 2 3
RowPos[i] i 行前非零元素总数 0 2 3 5 0 2 3 5
k++; } B->m = m; B->n = n; B->t = k; } main() { TSMatrix B; float A[5][5]; …… CreateTriTable(&B, A, 5, 5); …… } 例:写一算法,实现以三元组表结构存储的稀疏矩阵的转置 运算。 原矩阵